【问题标题】:Maintain the querystring in all pages in mvc在mvc中维护所有页面中的查询字符串
【发布时间】:2009-11-24 11:23:38
【问题描述】:

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

例如: 我会打电话给一个页面www.example.com?Preview=True。无论我在www.example.com 中单击哪个页面,都应维护查询字符串。即当我点击www.example.com中的About us页面时,url应该是www.example.com/AboutUs?Preview=True

我怎样才能做到这一点?做这个常见操作的最佳位置是什么?

【问题讨论】:

  • t想想你的设计是否有问题,你不应该这样做..我猜。
  • 如果用户从主网站单击第二个网站的预览,我需要提供该选项以禁用第二个网站中的所有控件。

标签: asp.net-mvc query-string


【解决方案1】:

也许您需要自定义路线?:

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

【讨论】:

  • 在哪里使用这个自定义路由?
  • 除了会话还有其他方法吗?因为当我集成它时,我几乎没有问题......即当用户单击预览时,它会在预览中显示第二个网站,并且禁用所有控件。同时,当用户将其视为实时时,即使这样,控件也会被禁用,因为它在会话中具有“预览”键
  • 如果用户从预览模式切换到实时模式,您可能希望从会话中删除该“预览”键。
【解决方案2】:

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

这可能是help

您可能会更好地将这些信息存储在会话中。

【讨论】:

    【解决方案3】:

    来自@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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多