2009-11-24 7 views
6

Ich muss die Querystring auf allen Seiten in meiner asp.net mvc (C#) -Anwendung pflegen.Pflegen Sie die Querystring auf allen Seiten in mvc

Für Beispiel: Ich rufe eine Seite www.example.com?Preview=True. Der Querystring sollte beibehalten werden, unabhängig davon, auf welche Seite ich klicke www.example.com. Wenn ich auf die Seite About us in www.example.com klicke, sollte die URL www.example.com/AboutUs?Preview=True

sein. Wie kann ich das erreichen? Was ist der beste Ort, um diese gemeinsame Operation zu machen?

+0

tDenke darüber nach, ob etwas mit deinem Design nicht stimmt, du solltest das nicht tun müssen. – Matias

+0

Ich muss diese Option angeben, um alle Steuerelemente auf der zweiten Website zu deaktivieren, wenn der Benutzer auf die Vorschau der zweiten Website von der Hauptwebsite aus klickt. – Prasad

Antwort

0

Eine ausgezeichnete Richtung von @ eu-g e-ne.

Ich habe die Idee der benutzerdefinierten Route von @ eu-ge-ne verwendet, um den Routenwert zu jeder URL hinzuzufügen und einen Basiscontroller verwendet, um den Vorschau-Schlüssel in Sitzung zu behandeln.

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 
    } 

Ich habe den obigen Code in der Initialize Methode der Basissteuereinheit verwendet. Auf diese Weise wird der Vorschauschlüssel in der Sitzung angezeigt, wenn der Querystring Vorschau hat, sonst wird er aus der Sitzung entfernt.

Danke nochmal an @ eu-ge-ne.

0

Sie könnten einen View-Helper erstellen, der den vorhandenen Abfrage-String an alle Links anfügt, die Sie mit Ihrem neuen Helper erstellen.

Diese help

kann vielleicht Sie besser sein, diese Informationen in der Sitzung zu speichern.

2

Vielleicht brauchen Sie eine benutzerdefinierte Route ?:

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

}

Set Session["Preview"] jederzeit und Sie werden alle Ihre Urls mit ?Preview=True erhalten:

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

AKTUALISIERT:

Mit dieser Route in dem Global.asax.cs:

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

statt:

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

Sie können auch diese Erweiterung versuchen:

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

Wo kann diese benutzerdefinierte Route verwendet werden? – Prasad

+0

gibt es einen anderen Weg als Sitzung? Denn wenn ich es integriert habe, habe ich ein paar Probleme ... d. H. Wenn der Benutzer auf die Vorschau klickt, wird die zweite Webseite in der Vorschau angezeigt, wobei alle Steuerelemente deaktiviert sind.Und zur gleichen Zeit, wenn der Benutzer es als live ansieht, werden auch die Steuerelemente deaktiviert, da es die Taste "Vorschau" in der Sitzung – Prasad

+0

hat. Wenn der Benutzer vom Vorschau- in den Live-Modus wechselt, möchten Sie das entfernen. " Vorschau "Schlüssel aus der Sitzung. – jrista

Verwandte Themen