Область MVC - Вид не найден
У меня есть проект, который использует области MVC. В области есть весь проект, в то время как основные папки "Представления/Контроллеры/Модели" за пределами Областей пусты, запрет диспетчера диспетчеризации, который у меня настроен, который направляет входящие запросы по умолчанию на Домашний контроллер в моей области.
Этот контроллер имеет один из следующих способов: -
public ActionResult Index(string id)
{
return RedirectToAction("Index", "Home", new {area = "xyz"});
}
У меня также есть настройка маршрута по умолчанию, чтобы использовать этот контроллер следующим образом: -
routes.MapRoute(
"Default", // Default route
"{controller}/{action}/{id}",
new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional }
);
Любые запросы по умолчанию на мой сайт соответствующим образом направляются в соответствующую область. Метод "RegisterArea" имеет один маршрут: -
context.MapRoute(
"xyz_default",
"xyz/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
В моей области есть несколько контроллеров с большим количеством просмотров. Любой вызов определенного вида в этих методах контроллера, таких как "return View" ( "бла" );
отображает правильный вид. Однако всякий раз, когда я пытаюсь возвратить представление вместе с объектом модели, переданным в качестве параметра, я получаю
следующая ошибка: -
Server Error in '/DeveloperPortal' Application.
The view 'blah' or its master was not found. The following locations were searched:
~/Views/Profile/blah.aspx
~/Views/Profile/blah.ascx
~/Views/Shared/blah.aspx
~/Views/Shared/blah.ascx
Похоже, всякий раз, когда объект модели передается как параметр. к методу "Просмотр()" (см. return View ( "blah", obj)] ищет точку зрения
в корне проекта, а не в конкретной папке просмотра.
Что мне здесь не хватает?
Спасибо заранее.
Ответы
Ответ 1
Решено! Несколько моих вызовов "RedirectToAction" не указывали имя области явно в параметре коллекции маршрутного объекта этого метода. Странно, однако, что это требуется, даже несмотря на то, что перенаправление контроллеров находится в одной области. Кроме того, HtmlActionLinks отлично работают, когда я не указываю новую {area = "blah" } в своей коллекции маршрутных объектов, поэтому мне интересно, почему вызовы контроллера требуют RedirectToAction(), даже если оба действия вызывающего и вызываемого контроллера находятся в одной области.
Ответ 2
Если вы используете вместо
context.MapRoute(
"xyz_default",
"xyz/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
использовать
context.MapRoute(
"xyz_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
в
xyzAreaRegistration.cs
тогда вам не нужно явно указывать область в любой ссылке...
Ответ 3
Добавьте атрибут RouteArea в класс Controller, чтобы MVC знал, что использовать область "XYZ" для представлений (а затем вы можете установить AreaPrefix в пустую строку, чтобы маршруты не начинались с "XYZ" ).
[RouteArea("Xyz", AreaPrefix = "")]
public class XyzController : Controller
{
...
}
Ответ 4
Если это проблема маршрутизации, вы можете исправить ее, сначала зарегистрировав свои маршруты. Это приводит к тому, что механизм маршрутизации пытается сопоставить один из маршрутов области перед сопоставлением корневого маршрута:
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Если я заставляю ошибку, переименовывая одну из папок в моем приложении областей, я получаю другую ошибку, чем ваша:
The view 'Index' or its master was not found. The following locations
were searched:
~/Areas/xyz/Views/Document/Index.aspx
~/Areas/xyz/Views/Document/Index.ascx
~/Areas/xyz/Views/Shared/Index.aspx
~/Areas/xyz/Views/Shared/Index.ascx
...and then the usual root view folders..
.. который является образцом подкаталогов, которые он будет искать, если бы он думал, что он находится в области.
Ответ 5
Проверьте сгенерированный код в MyAreaAreaRegistration.cs и убедитесь, что параметр контроллера установлен на ваш контроллер по умолчанию, иначе контроллер будет вызван ботом по какой-либо причине ASP.NET MVC не будет искать представления в папке области
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"SomeArea_default",
"SomeArea/{controller}/{action}/{id}",
new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
);
}
Ответ 6
У меня была такая же проблема и она была решена, установив свойство ascx 'Build Action' в "Embedded Resource".
Ответ 7
Попробуйте этот код. Сделайте изменения в файле регистрации области...
context.MapRoute(
"YourRouteName", // Route name //
"MyAreaName/MyController/{action}", // URL with parameters //
new {
controller = "MyControllerName",
action = "MyActionName", meetId = UrlParameter.Optional
}, // Parameter defaults
new[] { "Your Namespace name" }
);
Ответ 8
Для тех, кто ищет решение .net core, используйте
app.UseMvc(routes =>
{
routes.MapRoute(
name : "areas",
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
});'
Если у вас есть некоторый код в основном проекте и некоторый код в областях, используйте следующий код.
app.UseMvc(routes => {
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Обратите внимание, что в контроллере определены области
[Area("Test")]
public class TestController : Controller
{
public IActionResult Index()
{
return View();
}
}
}