Маршрутизация перестает работать, когда я перевожу URL - PullRequest
1 голос
/ 23 апреля 2019

Я создаю простой MVC-проект для тестирования перевода URL-адресов.Я использую пакет nuget RouteLocalization.MVC для перевода.Когда я добавляю этот пакет и настраиваю его, маршрутизация перестает работать, и я всегда получаю ошибку http 404, даже если URL совпадает с маршрутом.

Здесь, шаг за шагом, что я сделал:

  1. Я создал проект MVC, простой контроллер и простое действие, возвращающее представление.
  2. Я настроил маршрут для наличия языка в URL.Вот код в моем RouteConfig.cs:

    routes.MapRoute(
        name: "Default",
        url: "{lang}/{controller}/{action}/{id}",
        constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" },
        defaults: new { lang = "it", controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    
    routes.MapRoute(
        name: "Default2",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    
  3. Я создал пользовательский IControllerActivator, который меняет мой язык, и я зарегистрировал его в своем Global.asax:

    public class LocalizedControllerActivator : IControllerActivator
    {
        private string _DefaultLanguage = "it";
    
        public IController Create(RequestContext requestContext, Type controllerType)
        {
            //Get the {language} parameter in the RouteData
            string lang = _DefaultLanguage;
            if (requestContext.RouteData.Values["lang"] != null)
                 lang = requestContext.RouteData.Values["lang"].ToString();
    
            if (lang != _DefaultLanguage)
            {
                try
                {
                    Thread.CurrentThread.CurrentCulture =
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
                }
                catch (Exception e)
                {
                    throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
                }
            }
    
            return DependencyResolver.Current.GetService(controllerType) as IController;
        }
    }
    
  4. На данный момент все работает правильно.И если я переключаюсь между it и en, я вижу разницу во взглядах.

  5. Я добавляю RouteLocalization.MVC NuGet Package.Я украшаю свой контроллер / действие переведенным URL.

    [RoutePrefix("HomeITA")]
    public class HomeController : Controller
    {
        [Route("IndexITA", Name = "IndexRouteName")]
        public ActionResult Index()
        {
            return View();
        }
    }
    
  6. В RouteConfig.cs перед настройкой маршрута я добавляю эту строку:

    routes.MapMvcAttributeRoutes(Localization.LocalizationDirectRouteProvider);
    

Все перестает работать.Я использую отладчик маршрута, чтобы понять, в чем заключается моя ошибка, но я не понимаю.Вот результат:

  1. Проверка, если я использую имя контроллера / действия.Здесь пользовательский IControllerActivator запустить:

enter image description here

Тест, если использовать переведенный URL.Здесь пользовательский IControllerActivator не запускается:

enter image description here

Что не так?Спасибо тебе

...