2016-03-30 3 views
0

У нас есть приложение MVC с различными областями. В данный момент регистрируется только одна область (определенная в конфигурации), и регистрация маршрута не выполняется при регистрации области. Я столкнулся с проблемами с маршрутизацией, поскольку метод Url.Action прекратил работу. Мой упрощена RouteConfig выглядит следующим образом:MVC5 Url.Action возвращает null внутри области

 routes.MapRoute(
      name: "Second", 
      url: "second/{action}/{id}", 
      defaults: new { controller = "Second", action = "Action", id = UrlParameter.Optional }, 
      namespaces: new[] { "MvcApplication1.Areas.MyArea.Controllers" } 
     ).DataTokens["area"] = "MyArea"; 


     routes.MapRoute(
      name: "Home", 
      url: "home/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "MvcApplication1.Controllers" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "MvcApplication1.Controllers" } 
     ); 

Проблема заключается в том, что, когда я пытаюсь вызвать @Url.Action("Index", "Home") внутри Action.cshtml во Втором контроллере в MyArea возвращает нуль. Когда я вызываю то же самое в Index.cshtml в Home controller, он работает хорошо. Я узнал, что когда я использую @Url.Action("Index", "Home", new {Area = ""}) в Action.cshtml, он тоже хорошо работает, но почему это происходит? Как я могу избежать этого, чтобы иметь возможность звонить только @Url.Action("Index", "Home") без значений маршрута?

ответ

1

Это не проблема, но на самом деле это правильное поведение.

Когда вы используете @ Url.Action() или @ Html.ActionLink, он по умолчанию будет использовать область, из которой она вызывается. Если вы хотите установить ссылку на другую область, так как в этом случае вам нужно указать область параметров, как вы уже выяснили.

В этом конкретном случае, когда вы пытаетесь установить связь с корневой областью, вам нужно указать параметр как пустую строку, как вы это делали. ({Area = ""})

Смежные вопросы