简介:
我开发了多语言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参数?
答案 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并从请求中获取任何数据。