Как извлечь параметры из маршрута в фильтр? - PullRequest
0 голосов
/ 26 февраля 2020

Я создал фильтр, позволяющий мне выбирать конкретное представление c в зависимости от значения параметра lang в URL. Если lang = fr, будет вызван view_fr.cs html.

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" всегда пуст. Что я делаю неправильно ? Спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

Ваш маршрут локализации не определяет необязательный параметр id, и поэтому он будет совпадать только в том случае, если в URL присутствуют все четыре параметра маршрута. Следовательно, вы используете только маршрут по умолчанию, в котором нет параметра lang.

...