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