2009-11-24 13 views
6

Ho bisogno di mantenere la querystring in tutte le pagine nella mia applicazione asp.net mvc (C#).Mantenere la querystring in tutte le pagine in mvc

Per es .: Chiamerò una pagina www.example.com?Preview=True. La querystring dovrebbe essere mantenuta indipendentemente dalla pagina in cui clicco su www.example.com. vale a dire quando clicco About us pagina in www.example.com, l'URL deve essere www.example.com/AboutUs?Preview=True

come posso raggiungere questo obiettivo? Qual è il posto migliore per fare questa operazione comune?

+0

tTinka se qualcosa non va nel tuo progetto, non dovresti farlo .. Immagino. – Matias

+0

Devo fornire questa opzione per disabilitare tutti i controlli nel secondo sito Web, se l'utente fa clic sull'anteprima del secondo sito Web dal sito Web principale. – Prasad

risposta

0

Una direzione eccellente da @ eu-g e-NE.

Ho usato l'idea del percorso personalizzato da @ eu-ge-ne per aggiungere il valore del percorso a ogni url e utilizzato un basecontroller per gestire la chiave di anteprima nella sessione.

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 
    } 

Ho utilizzato il codice precedente nel metodo Initialize del controller di base. In questo modo la chiave di anteprima entrerà in sessione se la querystring ha Anteprima, altrimenti rimuoverà dalla sessione.

Grazie a @ eu-ge-ne ancora una volta.

0

È possibile creare un helper di visualizzazione che accoda la stringa di query esistente su qualsiasi collegamento creato con il nuovo helper.

Questo può help

potrebbe essere meglio memorizzare queste informazioni in sessione.

2

forse avete bisogno di un percorso personalizzato ?:

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; 
    } 
} 

}

Impostare Session["Preview"] in qualsiasi momento e si ottengono tutti gli URL con ?Preview=True:

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

aggiornamento:

Utilizzare questo percorso nel Global.asax.cs:

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

invece di:

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

Inoltre si può provare questa estensione:

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); 
     } 
    } 
} 

In Global.asax.cs:

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

Dove utilizzare questo percorso personalizzato? – Prasad

+0

c'è qualche altro modo tranne la sessione? Perché quando l'ho integrato, ho pochi problemi ... cioè quando l'utente fa clic sull'anteprima, mostra il secondo sito Web in anteprima con tutti i controlli disabilitati.E allo stesso tempo, quando l'utente lo vede come live, anche allora i controlli saranno disabilitati, in quanto ha la chiave "Anteprima" nella sessione – Prasad

+0

Se l'utente passa dalla modalità Anteprima alla modalità Live, vorrà rimuoverlo " Anteprima "chiave dalla sessione. – jrista

Problemi correlati