MVC 3 Зона маршрута не работает - PullRequest
11 голосов
/ 26 февраля 2011

Я создал область в своем приложении MVC 3 под названием «Блог».

В global.asax у меня есть следующий код.

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

    }

Это код моего Района

public class BlogAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Blog"; }
    }

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

Когда я перехожу на следующий URL http://localhost/CMS/blog, я получаю следующую ошибку.

Представление «Индекс» или его мастер не найдены, или никакой движок представления не поддерживает искомые местоположения. Были найдены следующие места: ~ / Views / блог / index.aspx ~ / Views / блог / Index.ascx ~ / Views / Shared / index.aspx ~ / Views / Shared / Index.ascx ~ / Views / блог / Index.cshtml ~ / Views / блог / Index.vbhtml ~ / Views / Shared / Index.cshtml ~ / Просмотров / Shared / Index.vbhtml

Как мне решить эту проблему?

Ответы [ 8 ]

26 голосов
/ 12 июля 2011

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

VB:

routes.MapRoute(
      "Default",
      "{area}/{controller}/{action}/{id}",
      New With {.area = "MyArea", .controller = "Home", .action = "Index", .id = UrlParameter.Optional}
)

C #:

routes.MapRoute(
       "Default",
       "{area}/{controller}/{action}/{id}",
       new { area = "MyArea", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Если вы перейдете к корню своего приложения по URL-адресу, вы можете получить сообщение об ошибке во время выполнения, например:

Представление «Индекс» или его мастер не найдены или отсутствует механизм просмотраподдерживает поиск мест.Были найдены следующие местоположения:

По какой-то причине механизм просмотра не выглядит в папке области для файла представления так же, как при вводе всей ссылки.Странно то, что код достигает действия контроллера.Вот исправление: вставьте этот код в действие вашего контроллера:

VB:

If Not Me.ControllerContext.RouteData.DataTokens.ContainsKey("area") Then
                Me.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
            End If

C #

  if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
{
        this.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
 }
8 голосов
/ 22 августа 2011

Регистрация в вашем регионе неверна. Вы указываете значение по умолчанию для своего действия, но не для контроллера. Поскольку в качестве имени контроллера обычно используется Home, вам необходимо указать это.

Также возможно, что у вас неправильно настроены папки, так как у вас должны быть физические настройки:

  • / Areas / Блог
  • / Области / Блог / Контроллеры
  • / Области / Блог / Просмотров

... и после того, как вы исправите маршрут области блога, вам также понадобится:

  • / Области / Блог / Представления / Главная страница << Поместите свой индексный указатель сюда </li>

Похоже, ошибка, которую вы получаете, достаточно ясно указывает на эту проблему.

3 голосов
/ 06 июля 2012

Relax!Это может сэкономить вам часы чтения, приготовление кофе и просмотр этого 3-минутного видео, все будет ясно для вас.http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas (я верю, что это также работает для mvc3, mvc4 и mvc2035) enter image description here

3 голосов
/ 27 февраля 2011

Я использую routedebugger Фила Хаака для устранения проблем, подобных этой.Он удобно показывает все зарегистрированные маршруты и соответствие введенного URL-адреса вашей конфигурации.

Он работает путем переопределения обычного потока приложения, который вы включаете, добавляя эту строку в конце Application_Start:

RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );
2 голосов
/ 06 июля 2011

Исходя из ответа Мортенса , теперь вы можете NuGet (или загрузить и установить вручную) пакеты RouteMagic или Glimpse , обеспечивающие эту функциональность, и больше.

Более подробная информация доступна на блоге Фила Хаака о состоянии его инструмента и о том, во что он превратился. Комментарии также полезны для чтения!

0 голосов
/ 04 февраля 2014

Просто попробуйте удалить содержимое из следующих каталогов, как указано здесь и пересобрать проект

C: \ Temp C: \ Users \% Имя пользователя% \ AppData \ Local \ Microsoft \ VisualStudio C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Временные файлы ASP.NET C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Временный ASP.NET Путь к файлам \ To \ Your \ Project \ obj \ Debug

0 голосов
/ 11 июня 2013

У меня была та же проблема, что и в Mindstorm Interactive, и я выбрал немного другой подход.Да, он перенаправляет пользователя, но он заставляет мой код выглядеть менее обходным, если можно так выразиться.

Я создал новый контроллер, независимо от того, в какой области, так как проблема в средстве визуализации не находит представление,не контроллер.

Затем контроллер перенаправляет с включенной областью (как в Mindstroms fix, ключ) и вуаля.

public class StartController : Controller
{
  public ActionResult Index()
  {
    return RedirectToAction("Index", "MyController", new { area = "MyArea" });
  }
}

в RouteConfig просто добавьте

routes.MapRoute(name: "Root", url: "", defaults: new { controller = "Start", action = "Index", area = "MyArea" });

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 05 апреля 2013

Проверьте, отображается ли у вас виртуальный путь в качестве имени области.Я установил адрес области в Visual Studio только для отладки, и он попросил меня создать виртуальный путь.Таким образом, AppRelativeCurrentExecutionFilePath всегда был ~ / и маршрутизация не могла определить область.Для IIS express удалите виртуальный путь для вашего сайта:

C:\Users\username\Documents\IISExpress\config\applicationhost.config

Я потратил 4 дня на его обнаружение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...