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", вы можете изменить маршрутизацию, чтобы обработать это.