【问题标题】:How to set cookie value as default value for MapRoute parameter?如何将 cookie 值设置为 MapRoute 参数的默认值?
【发布时间】:2017-02-14 07:23:13
【问题描述】:

简介:

我开发多语言网络应用程序。管理员可以创建新语言(此信息存储在数据库中)。因此,语言不会在代码中的某处硬编码。用户的首选语言存储在浏览器 cookie 中。

现在我想从这里配置 url 路由:

www.host.com/home/about

到这里:

www.host.com/{lang}/home/about

RouteConfig.cs 看起来像:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.LowercaseUrls = true;

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        foreach (Route r in routes)
        {
            r.Url = "{lang}/" + r.Url;
            if (r.Defaults == null)
                r.Defaults = new RouteValueDictionary();
            r.Defaults.Add("lang", ServiceLocalization.GetLanguageFromBrowserCookie());
        }
    }
}

参数 {lang} 被添加到每个请求 url。我需要从 cookie 中设置默认值。服务方法GetLanguageFromBrowserCookie()使用HttpContext.Current.Request.Cookies对象访问客户端发送的cookies。

但是HttpContext.Current.Request 对象在请求处理管道的这个阶段是不可访问的。我得到这个错误:“请求在这个上下文中不可用”

有没有办法获取带有 cookie 值的 MapRoute 参数?

【问题讨论】:

    标签: asp.net-mvc cookies asp.net-mvc-routing


    【解决方案1】:

    好的。我想出了如何做到这一点。我们需要创建自定义 RouteHandler 来处理带有额外逻辑的请求 url。

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.LowercaseUrls = true;
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            ).RouteHandler = new CustomRouteHandler();
        }
    }
    public class CustomRouteHandler : MvcRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var route = (Route)requestContext.RouteData.Route;
    
            if (!route.Url.Contains("{lang}"))
                route.Url = "{lang}/" + route.Url;
            if (route.Defaults == null)
            {
                route.Defaults = new RouteValueDictionary();
                route.Defaults.Add("lang", ServiceLocalization.GetLanguageFromBrowserCookie().CodeName);
            }
            else
            {
                route.Defaults["lang"] = ServiceLocalization.GetLanguageFromBrowserCookie().CodeName;
            }
    
            return base.GetHttpHandler(requestContext);
        }
    }
    

    我创建CustomRouteHandler 并将其传递给默认路由。在GetHttpHandler 方法中,我们可以访问当前的 HttpRequest 并从请求中获取任何数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2017-02-03
      • 2013-01-01
      • 2018-07-21
      相关资源
      最近更新 更多