在mvc中的所有页面中维护查询字符串

时间:2009-11-24 11:23:38

标签: asp.net-mvc query-string

我需要在asp.net mvc(C#)应用程序的所有页面中维护查询字符串。

例如: 我将调用一个页面www.example.com?Preview=True。无论我在www.example.com中点击哪一页,都应该维护查询字符串。即当我点击About us中的www.example.com页面时,网址应为www.example.com/AboutUs?Preview=True

我怎样才能做到这一点?什么是做这种常见操作的最佳地点。?

3 个答案:

答案 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)

您可以创建一个视图助手,将现有查询字符串附加到您使用新助手创建的任何链接上。

这可能是help

您可能最好将此信息存储在会话中。

答案 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。