Области MVC — Маршрут, не относящийся к области, преобразуется в область

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-areas

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-areas

Вопрос:

Я добавил область в свой проект MVC 3. Кажется, я не могу заставить маршрутизацию работать с очень простым сценарием. Кажется, что он всегда хочет разрешаться в область. Вот моя конфигурация. При запуске:

 AreaRegistration.RegisterAllAreas();
IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Browse", action = "Index", id = UrlParameter.Optional }
  

И

 public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Admin"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Users", action = "Index", id = UrlParameter.Optional }
        );
    }
}
  

В web.config:

 <authentication mode="Forms">
  <forms loginUrl="~/Login" defaultUrl="~/Browse" timeout="60" cookieless="UseDeviceProfile" />
</authentication>
  

Я использую RouteDebugger, чтобы попытаться решить эту проблему. Когда я перехожу на страницу входа в систему, отладчик показывает:

  • Путь к файлу AppRelativeCurrentExecutionFilePath: ~Login
  • Администратор / {контроллер} / {действие} / {идентификатор} Не соответствует текущему запросу
  • {контроллер} / {действие} / {идентификатор} Соответствует текущему запросу
  • Согласованный маршрут: {контроллер} / {действие} / {идентификатор}

Пока все хорошо. Но затем он показывает это:

  • Сгенерированный URL: /Admin/Login?returnUrl=/ с использованием маршрута «Admin /{controller}/{action}/{id}»

Затем я вхожу в систему. Мой метод входа / индексации не выполняется, и отладчик показывает:

  • Путь к файлу AppRelativeCurrentExecutionFilePath: ~Login
  • Администратор / {контроллер} / {действие} / {идентификатор} Не соответствует текущему запросу
  • {контроллер} / {действие} / {идентификатор} Соответствует текущему запросу
  • Согласованный маршрут: {контроллер} / {действие} / {идентификатор}
  • Сгенерированный URL: /Admin/Login?returnUrl=/Admin/Login с использованием маршрута «Admin /{controller}/{action}/{id}»

С одной стороны, он говорит, что он не соответствует маршруту администратора, затем в сгенерированном URL-адресе говорится, что он использует этот маршрут. Я в тупике.

Ответ №1:

Попробуйте добавить свой параметр area с предопределенным значением в ваше определение маршрутизации… Например, вместо:

 context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Users", action = "Index", id = UrlParameter.Optional }
        );
  

используйте:

 context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { area = "Admin", controller = "Users", action = "Index", id = UrlParameter.Optional }
        );
  

Дайте мне знать, если это поможет…
С уважением

Комментарии:

1. Я сделал именно так, как вы говорите. Сначала я попытался выполнить регистрацию области перед регистрацией, не относящейся к области. Ничего хорошего. Ссылки на контроллер, не относящийся к области, всегда разрешаются с помощью «Admin /» перед ними. Поэтому я изменил порядок регистрации. Затем, когда я перехожу к «~ / Admin», я получаю «~ / Home / NotFound», при этом отладчик показывает совпадение с маршрутом «{controller} / {action} / {id}». Когда я перехожу к «~/Admin / Users», я получаю «~ /Admin / Home/ Home / Home / NotFound», при этом отладчик показывает совпадение по маршруту {catchall}.

2. Когда я говорю «Ссылки на контроллер, не относящийся к области, всегда разрешаются с помощью ‘Admin /’ перед ними», это не совсем верно. HTML. ActionLink<T> разрешается правильно. Но Html.BeginForm<T> и Html.BuildUrlFromExpression<T> преобразуются в область администратора, даже если T является контроллером, которого НЕТ в области.

3. Я использовал версию Microsoft.Web.Mvc 2.0, в которой эти методы не понимают области. Это исправлено в версии 3.0.