如何将cookie值设置为MapRoute参数的默认值?

时间:2016-10-05 18:06:33

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

简介:

我开发了多语言Web应用程序。管理员可以创建新语言(此信息存储在数据库中)。所以语言在代码中没有硬编码。用户的首选语言存储在浏览器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}被添加到每个请求网址。我需要从cookie设置默认值。服务方法GetLanguageFromBrowserCookie()使用HttpContext.Current.Request.Cookies对象来访问客户端发送的cookie。

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

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

1 个答案:

答案 0 :(得分: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并从请求中获取任何数据。