2009-11-24 24 views
6

Tôi cần duy trì chuỗi truy vấn trong tất cả các trang trong ứng dụng asp.net mvc (C#) của mình.Duy trì chuỗi truy vấn trong tất cả các trang trong mvc

Ví dụ: Tôi sẽ gọi một trang www.example.com?Preview=True. Chuỗi truy vấn phải được duy trì bất kể trang nào tôi nhấp vào trong www.example.com. tức là khi tôi nhấp vào trang About us trong www.example.com, url phải là www.example.com/AboutUs?Preview=True

Làm cách nào để tôi có thể đạt được điều này? Whats là nơi tốt nhất để làm điều này hoạt động phổ biến.?

+0

tThông tin về điều gì đó không ổn với thiết kế của bạn, bạn không cần phải làm điều đó .. Tôi đoán vậy. – Matias

+0

Tôi cần phải cung cấp tùy chọn đó để tắt tất cả các điều khiển trong trang web thứ hai, nếu người dùng nhấp vào xem trước trang web thứ hai từ trang web chính. – Prasad

Trả lời

0

Một hướng tuyệt vời từ @ eu-g e-ne.

Tôi đã sử dụng ý tưởng về tuyến đường tùy chỉnh từ @ eu-ge-ne để thêm giá trị tuyến đường vào mỗi url và sử dụng bộ điều khiển cơ sở để xử lý khóa Xem trước trong phiê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 
    } 

Tôi đã sử dụng mã ở trên trong phương thức Initialize của bộ điều khiển cơ sở. Bằng cách này, phím xem trước sẽ trong phiên nếu chuỗi truy vấn có Xem trước, nếu không thì khóa đó sẽ bị xóa khỏi phiên.

Nhờ @ eu-ge-ne một lần nữa.

0

Bạn có thể tạo Trình xem trợ giúp bổ sung chuỗi truy vấn hiện có vào bất kỳ liên kết nào bạn tạo với trình trợ giúp mới của mình.

này có thể help

Bạn có thể được tốt hơn lưu trữ thông tin này trong phiên.

2

Có lẽ bạn cần một lộ trình tùy chỉnh ?:

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

}

Đặt Session["Preview"] bất cứ lúc nào và bạn sẽ nhận được tất cả các url của bạn với ?Preview=True:

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

CẬP NHẬT:

Sử dụng tuyến đường này trong Global.asax.cs:

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

thay vì:

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

Ngoài ra bạn có thể thử mở rộng này:

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

Trong Global.asax.cs:

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

Nơi sử dụng tuyến đường tùy chỉnh này? – Prasad

+0

có cách nào khác ngoài phiên không? Bởi vì khi tôi tích hợp nó, tôi có vài vấn đề .. tức là khi người dùng nhấp vào bản xem trước, nó cho thấy trang web thứ hai trong bản xem trước với tất cả các điều khiển bị tắt.Đồng thời, khi người dùng xem trực tiếp, ngay cả khi điều khiển sẽ bị vô hiệu hóa, vì nó có phím "Xem trước" trong phiên – Prasad

+0

Nếu người dùng chuyển từ chế độ Xem trước sang Trực tiếp, bạn sẽ muốn xóa điều đó " Xem trước "khóa từ phiên. – jrista

Các vấn đề liên quan