如何从路由中检索参数到过滤器?

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 参数。