MVC 3 не ищет представления в разделе Areas
Я использую несколько областей в MVC 3, и у меня возникают проблемы с тем, что мои представления не найдены. Маршрутизация, кажется, правильно подбирает мои контроллеры (все действия выполняются без каких-либо проблем), но когда я возвращаю представление, MVC просто не находит его.
Итак, если у меня есть простой контроллер под названием "Вещь" в области "Некоторые", и я делаю следующее...
public ActionResult Index()
{
return View("Index");
}
Действие выполняется правильно, но MVC не находит представление, и я получу сообщение, говорящее что-то вроде
Вид "Индекс" или его мастер не был найден... И он покажет мне все найденные местоположения, которые будут
~/Views/Thing/Index.cshtml
~/Views/Shared/Index.cshtml
и т.д., но он не выглядит в
~/Некоторые/Views/Thing/Index.cshtml
Любые идеи о том, что я делаю неправильно?
Ответы
Ответ 1
Хорошо, извините, что я должен ответить на свой вопрос, но никто не дал мне ответ, который я искал. Кажется, моя проблема связана с пользовательской маршрутизацией.
Чтобы воссоздать проблему, я создал пустой проект MVC 3 и добавил область под названием "Some" и контроллер в этой области под названием "Thing". На предмет я создал действие индекса, которое просто вернуло представление. Затем я добавил представление индекса в ~/Areas/Some/Views/Thing/Index.cshtml
Великий. Поэтому, когда я нажимаю /Some/Thing/Index, он возвращает изображение правильно.
Теперь перейдите и добавьте маршрут в Global.asax, который выглядит следующим образом:
routes.MapRoute(
"Custom", // Route name
"Bob", // URL with parameters
new { area = "Some", controller = "Thing", action = "Index" }
);
Теперь, когда я перехожу к /Bob, я получаю ошибку, о которой я упоминал, - MVC не находит представление. Чтобы исправить эту проблему, мне пришлось зарегистрировать этот маршрут в классе SomeAreaRegistration вместо Global.asax. Мне также не понадобилось свойство 'area', поэтому оно выглядит так.
context.MapRoute(
"Custom", // Route name
"Bob", // URL with parameters
new { controller = "Thing", action = "Index" }
);
Ответ 2
Если ваш контроллер имеет то же имя, что и область, ваш контроллер будет подхвачен базовым маршрутом по умолчанию {controller}/{action}
, прежде чем он проверит маршрут маршрута и, следовательно, будет искать вид в root/views, а не в области/представлениях. Переименование либо области, либо контроллера разрешит это.
Ответ 3
Попробуйте добавить следующий маршрут в global.asax:
context.MapRoute(
"default",
"Some/{controller}/{action}/",
new { controller = "Thing", action = "Index"}
);
Ответ 4
Убедитесь, что у вас есть файл с именем SomeAreaRegistration.cs в вашей области "Некоторые".
этот файл должен содержать примерно следующее:
public class SomeAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Some";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Some_default",
"Some/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Ответ 5
При использовании областей поместите свой index.cshtml в папку ~/Areas/Some/Views/Thing/Index.cshtml
Ответ 6
Вы проверили (установив точку останова), если вызван метод контроллера?
Страницы, которые вы указали в поисках поиска, не находятся в области "некоторые".
Откуда вы звоните по ссылке?
Если вы вызываете ссылку из другой области или из корня, вы должны установить область в ссылке действия:
@Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null)
Ответ 7
Просто добавьте другое решение здесь. У меня также была эта проблема, но моя была вызвана конфликтующим путем "поймать все" в Global.asax.cs
Удаление этого маршрута устранило проблему.
Ответ 8
Он не будет выглядеть в * ~ Some/* Views..... по умолчанию (я не уверен, как вы можете это сделать), соглашение будет ~/Views/......, так что это будет подходящее место для размещения представления. Если вы хотите, чтобы URL-адрес содержал "Some", вы можете изменить маршрутизацию, чтобы обработать это.