MVC 3 Не работает район

Я создал область в моем приложении 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 ~/Views/Shared/Index.vbhtml

Как это решить?

Ответ 1

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

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

  • /Районы/Блог
  • /Areas/Блог/Контроллеры
  • /Areas/Блог/Просмотров

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

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

Ошибка, которую вы получаете, довольно четко указывает, что это проблема.

Ответ 2

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

VB:

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

С#:

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

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

Объект "Index" или его мастер не был найден, или механизм просмотра не поддерживает найденные местоположения. Были обысканы следующие местоположения:

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

VB:

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

С#

  if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
{
        this.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
 }

Ответ 3

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

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

RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );

Ответ 4

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

Ответ 5

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

Более подробная информация доступна на блог Phil Haacks относительно состояния его инструмента и того, что он превратил в, Комментарии также хорошо читаются!

Ответ 6

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

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

Я провел 4 дня, чтобы обнаружить это.

Ответ 7

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

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

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

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" });

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

Ответ 8

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

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