如何从路由中检索参数到过滤器?
How to retrieve parameters from Route to Filter?
我创建了一个过滤器,允许我根据 URL 中参数 lang 的值 select 特定视图。如果lang=fr,将调用view_fr.cshtml。
public class LocalizedViewAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
string defaultLang = "en";
var routeData = filterContext.RouteData.Values;
string lang = (string)routeData["lang"];
if (!String.IsNullOrEmpty(lang))
{
defaultLang = lang;
}
var viewResult = filterContext.Result as ViewResultBase;
if (viewResult != null)
{
if (string.IsNullOrWhiteSpace(viewResult.ViewName))
{
viewResult.ViewName = filterContext.RouteData.GetRequiredString("action");
}
var v = ViewEngines.Engines.FindView(
filterContext.Controller.ControllerContext,
viewResult.ViewName + "_" + defaultLang, null
);
if (v.View != null)
viewResult.ViewName += "_" + defaultLang;
}
base.OnResultExecuting(filterContext);
}
}
以及本地化路线
routes.MapRoute(
name: "Localization",
url: "{lang}/{controller}/{action}/{id}", // URL with parameters
new { lang = "", controller = "Static", action = "Index" } // Parameter defaults
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Static", action = "Index", id = UrlParameter.Optional }
);
但参数"lang"始终为空。我究竟做错了什么 ?
谢谢。
您的本地化路由没有定义可选的 id
参数,因此只有在 URL 中存在所有四个路由参数时才会匹配。因此,您只会点击默认路由,该路由没有 lang
参数。
我创建了一个过滤器,允许我根据 URL 中参数 lang 的值 select 特定视图。如果lang=fr,将调用view_fr.cshtml。
public class LocalizedViewAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
string defaultLang = "en";
var routeData = filterContext.RouteData.Values;
string lang = (string)routeData["lang"];
if (!String.IsNullOrEmpty(lang))
{
defaultLang = lang;
}
var viewResult = filterContext.Result as ViewResultBase;
if (viewResult != null)
{
if (string.IsNullOrWhiteSpace(viewResult.ViewName))
{
viewResult.ViewName = filterContext.RouteData.GetRequiredString("action");
}
var v = ViewEngines.Engines.FindView(
filterContext.Controller.ControllerContext,
viewResult.ViewName + "_" + defaultLang, null
);
if (v.View != null)
viewResult.ViewName += "_" + defaultLang;
}
base.OnResultExecuting(filterContext);
}
}
以及本地化路线
routes.MapRoute(
name: "Localization",
url: "{lang}/{controller}/{action}/{id}", // URL with parameters
new { lang = "", controller = "Static", action = "Index" } // Parameter defaults
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Static", action = "Index", id = UrlParameter.Optional }
);
但参数"lang"始终为空。我究竟做错了什么 ? 谢谢。
您的本地化路由没有定义可选的 id
参数,因此只有在 URL 中存在所有四个路由参数时才会匹配。因此,您只会点击默认路由,该路由没有 lang
参数。