2009-11-24 63 views
6

我需要在我的asp.net mvc(C#)應用程序的所有頁面中維護查詢字符串。維護mvc中所有頁面的查詢字符串

例如: 我會打電話給頁面www.example.com?Preview=True。查詢字符串應該保持在www.example.com中點擊的頁面。即當我點擊About us頁面www.example.com時,網址應該是www.example.com/AboutUs?Preview=True

我該如何做到這一點?什麼是做這個共同操作的最佳地點?

+0

想想你的設計有什麼問題,你不需要那樣做..我想。 – Matias 2009-11-24 11:31:55

+0

如果用戶從主網站點擊預覽第二個網站,我需要給出該選項以禁用第二個網站中的所有控件。 – Prasad 2009-11-24 11:37:09

回答

0

從@ eu-g E-NE。

我使用了@ eu-ge-ne的自定義路由的思路,將路由值添加到每個網址,並使用基本控制器來處理會話中的預覽鍵。

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 
    } 

我在基本控制器的Initialize方法中使用了上面的代碼。這樣預覽鍵將在會話中查詢字符串是否具有預覽,否則會從會話中刪除。

再次感謝@ eu-ge-ne。

0

您可以創建一個視圖幫助器,將現有查詢字符串附加到您使用新幫助器創建的任何鏈接上。

這可能help

您可能會更好在會話中存儲這些信息。

2

也許你需要一個定製的路線?:

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

}

隨時設置Session["Preview"],你會得到你所有的網址?Preview=True

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

更新:

使用在Global.asax.cs中這條路線:代替

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

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

你也可以試試這個擴展:

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

在Global.asax.cs中:

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

在哪裏使用這個自定義路線? – Prasad 2009-11-24 13:32:06

+0

除會話外還有其他方式嗎?因爲當我整合它時,我有幾個問題..即當用戶點擊預覽,它顯示預覽中的第二個網站,禁用所有控件。同時,當用戶將其視爲直播時,即使這樣,控件也將被禁用,因爲它在會話 – Prasad 2009-11-25 03:58:02

+0

中具有「預覽」鍵。如果用戶從預覽切換到現場模式,則需要刪除該「預覽「會話中的密鑰。 – jrista 2009-11-26 05:17:42

相關問題