2009-11-24 6 views
6

Necesito mantener la cadena de consulta en todas las páginas en mi aplicación asp.net mvc (C#).Mantener la cadena de consulta en todas las páginas en mvc

Por ej .: Llamaré a la página www.example.com?Preview=True. La cadena de consulta se debe mantener en cualquier página que haga clic en www.example.com. es decir, cuando hago clic en About us en www.example.com, la url debe ser www.example.com/AboutUs?Preview=True

¿Cómo puedo lograrlo? ¿Cuál es el mejor lugar para hacer esta operación común?

+0

tConsidere si algo está mal con su diseño, no debería necesitar hacer eso ... supongo. – Matias

+0

Necesito dar esa opción para deshabilitar todos los controles en el segundo sitio web, si el usuario hace clic en la vista previa del segundo sitio web desde el sitio web principal. – Prasad

Respuesta

0

Una excelente dirección de @ eu-g e-ne.

He utilizado la idea de la ruta personalizada de @ eu-ge-ne para agregar el valor de la ruta a cada url y he usado un controlador base para manejar la tecla Vista previa en la sesión.

if ((requestContext.HttpContext.Request.QueryString != null && 
    requestContext.HttpContext.Request.QueryString["Preview"] != null && 
    requestContext.HttpContext.Request.QueryString["Preview"].ToString() =="True") || 
    (requestContext.HttpContext.Request.UrlReferrer != null && 
    requestContext.HttpContext.Request.UrlReferrer.ToString().Contains("Preview=True"))) 
    { 
     //Add the preview key to session 
    } 
    else 
    { 
     //Remove the preview key to session 
    } 

he utilizado el código anterior en el método de la controlador base Initialize. De esta forma, la clave de vista previa estará en sesión si la cadena de consulta tiene Vista previa, de lo contrario, se elimina de la sesión.

Gracias a @ eu-ge-ne una vez más.

0

Puede crear una vista Helper que anexa la cadena de consulta existente a cualquier enlace que cree con su nuevo ayudante.

Esto puede help

que podría ser mejor almacenar esta información en la sesión.

2

Tal vez necesita una ruta personalizada ?:

public class PreviewRoute : System.Web.Routing.Route 
{ 
    ... 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     var preview = System.Web.HttpContext.Current.Session["Preview"]; 

     if (!values.ContainsKey("Preview")) 
      values.Add("Preview", preview); 

     var path = base.GetVirtualPath(requestContext, values); 

     return path; 
    } 
} 

}

Establecer Session["Preview"] en cualquier momento y obtendrá todas las URL con ?Preview=True:

System.Web.HttpContext.Current.Session.Add("Preview", true); 

Actualizado:

El uso de esta ruta en el Global.asax.cs:

routes.Add("Default", 
    new PreviewRoute("{controller}/{action}/{id}", new MvcRouteHandler()) { 
     Defaults = new RouteValueDictionary(
      new { controller = "Home", action = "Index", id = "" } 
     ) 
    } 
); 

en lugar de:

routes.MapRouteLowercase(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

También puede probar esta extensión:

public static class CustomRouteExtensions 
{ 
    public static void MapPreviewRoute(this RouteCollection routes, string name, string url, object defaults) { 
     routes.MapPreviewRoute(name, url, defaults, null); 
    } 

    public static void MapPreviewRoute(this RouteCollection routes, string name, string url, object defaults, object constraints) { 
     if (routes == null) { 
      throw new ArgumentNullException("routes"); 
     } 

     if (url == null) { 
      throw new ArgumentNullException("url"); 
     } 

     var route = new PreviewRoute(url, new MvcRouteHandler()) { 
      Defaults = new RouteValueDictionary(defaults), 
      Constraints = new RouteValueDictionary(constraints) 
     }; 

     if (String.IsNullOrEmpty(name)) { 
      routes.Add(route); 
     } 
     else { 
      routes.Add(name, route); 
     } 
    } 
} 

En Global.asax.cs:

routes.MapPreviewRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 
+0

¿Dónde utilizar esta ruta personalizada? – Prasad

+0

¿hay alguna otra manera excepto la sesión? Porque cuando lo intenté, tengo algunos problemas ... es decir, cuando el usuario hace clic en la vista previa, muestra el segundo sitio web en la vista previa con todos los controles deshabilitados.Y al mismo tiempo, cuando el usuario lo ve como en vivo, incluso entonces los controles se desactivarán, ya que tiene la tecla "Vista previa" en la sesión – Prasad

+0

Si el usuario cambia de la vista previa al modo en vivo, querrá eliminar eso " Vista previa "clave de la sesión. – jrista

Cuestiones relacionadas