MVC 3 не ищет представления под областями - PullRequest
10 голосов
/ 20 июля 2011

Я использую несколько областей в MVC 3, и у меня возникают проблемы с тем, что мои виды не могут быть найдены. Кажется, что маршрутизация правильно определяет мои контроллеры (все действия выполняются без проблем), но когда я возвращаю представление, MVC просто не находит его.

Итак, если у меня есть простой контроллер под названием «Вещи» в области «Некоторые», и я делаю следующее ...

public ActionResult Index()
{
    return View("Index");
}

Действие выполнено правильно, но MVC не находит представление, и я получу сообщение, в котором будет что-то вроде

Представление «Индекс» или его мастер не найден ... И он покажет мне все найденные местоположения, которые будут

~ / Views / Thing / Index.cshtml ~ / Просмотров / Shared / Index.cshtml

и т. Д., И т. Д., Но это не выглядит в

~ / Некоторые / Views / Thing / Index.cshtml

Есть идеи, что я делаю не так?

Ответы [ 8 ]

17 голосов
/ 21 июля 2011

Хорошо, извините, что должен ответить на мой собственный вопрос, но никто не дал мне ответа, который я искал.Кажется, моя проблема была с пользовательской маршрутизацией.

Чтобы воссоздать проблему, я создал пустой проект MVC 3 и добавил область под названием «Some» и контроллер в этой области под названием «Thing».Я создал действие Index, которое просто вернуло представление.Затем я добавил представление «Индекс» в ~ / 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" }
                );

Теперь, когда я перемещаюсьto / Bob Я получил упомянутую ошибку - MVC не находит представление.Чтобы решить эту проблему, мне пришлось зарегистрировать этот маршрут в классе SomeAreaRegistration вместо Global.asax.Мне также не понадобилось свойство 'area', поэтому оно выглядит следующим образом.

    context.MapRoute(
        "Custom", // Route name
        "Bob", // URL with parameters
        new { controller = "Thing", action = "Index" }
        );
4 голосов
/ 14 ноября 2012

Если ваш контроллер имеет то же имя, что и область , ваш контроллер будет выбран базовым маршрутом по умолчанию {controller}/{action} ДО того, как он проверит маршрут области и, следовательно, будет искать представление в корневом каталоге. / взгляды, а не в области / взгляды. Переименование области или контроллера решит эту проблему.

1 голос
/ 21 июля 2011

При использовании областей поместите ваш index.cshtml в папку ~ / Areas / Some / Views / Thing / Index.cshtml

1 голос
/ 20 июля 2011

Убедитесь, что у вас есть файл с именем 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 }
        );
    }
}
1 голос
/ 20 июля 2011

Попробуйте добавить следующий маршрут в global.asax:

 context.MapRoute(
                "default",
                "Some/{controller}/{action}/",
                new { controller = "Thing", action = "Index"}
            );
0 голосов
/ 27 марта 2012

Просто чтобы добавить другое решение здесь. У меня также была эта проблема, но моя была из-за наличия конфликтующего маршрута «перехватить все» в Global.asax.cs

Удаление этого маршрута устранило проблему.

0 голосов
/ 21 июля 2011

Проверяли ли вы (путем установки точки останова), вызывается ли метод контроллера?

Страницы, которые вы перечислили, где выполняется поиск, не находятся в области "некоторые".Откуда вы звоните по ссылке?

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

 @Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null)
0 голосов
/ 20 июля 2011

Это не будет выглядеть в * ~ Некоторых / * Представлениях ..... по умолчанию (я не уверен, как вы можете форсировать это тоже), соглашение будет ~ / Views /. ....., так что это было бы правильным местом для размещения представления. Если вы хотите, чтобы URL содержал «Some», вы можете изменить маршрутизацию, чтобы справиться с этим.

...