我需要在asp.net mvc(C#)应用程序的所有页面中维护查询字符串。
例如:
我将调用一个页面www.example.com?Preview=True
。无论我在www.example.com
中点击哪一页,都应该维护查询字符串。即当我点击About us
中的www.example.com
页面时,网址应为www.example.com/AboutUs?Preview=True
我怎样才能做到这一点?什么是做这种常见操作的最佳地点。?
答案 0 :(得分: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
);
答案 1 :(得分:0)
答案 2 :(得分:0)
来自@ eu-ge-ne的优秀方向。
我使用@ eu-ge-ne的自定义路由的想法将路由值添加到每个url并使用basecontroller来处理会话中的Preview键。
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。