Области MVC - Вид не найден - PullRequest
12 голосов
/ 12 апреля 2010

У меня есть проект, который использует области 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 (" blah "); оказывает правильное представление. Однако всякий раз, когда я пытаюсь вернуть представление вместе с объектом модели, переданным в качестве параметра, я получаю следующая ошибка: -

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 

Похоже, всякий раз, когда объект модели передается как параметр. к методу «View ()» [например, return View ("blah", obj)] он ищет представление в корне проекта, а не в папке вида для конкретной области.

Что мне здесь не хватает?

Заранее спасибо.

Ответы [ 7 ]

8 голосов
/ 14 апреля 2010

Решено! Несколько моих вызовов «RedirectToAction» не указывали имя области явно в параметре коллекции объекта маршрута этого метода. Странно, однако, что это требуется, даже если все перенаправления контроллеров находятся в одной области. Кроме того, HtmlActionLinks работают нормально, когда я не указываю новый {area = "blah"} в его коллекции объектов маршрутов, поэтому мне интересно, почему вызовы действия контроллера для RedirectToAction () нуждаются в этом, хотя и вызывающий, и вызываемый действия контроллера все находятся в одной области.

6 голосов
/ 18 ноября 2013

Если вы используете вместо

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 голосов
/ 13 апреля 2010

Если это проблема маршрутизации, вы можете исправить ее, зарегистрировав маршруты вашего района first . Это приводит к тому, что механизм маршрутизации пытается сопоставить один из маршрутов области, до соответствия корневому маршруту:

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.. 

.. который является шаблоном подкаталогов, которые он будет искать, если подумает, что находится в области.

2 голосов
/ 08 марта 2017

Добавьте атрибут RouteArea в классе Controller, чтобы MVC знал, что нужно использовать область «XYZ» для представлений (а затем вы можете установить для AreaPrefix пустую строку, чтобы маршруты не начинались с «XYZ»).

[RouteArea("Xyz", AreaPrefix = "")]
public class XyzController : Controller   
{
...
}
2 голосов
/ 07 июня 2010

Проверьте сгенерированный код на MyArea AreaRegistration.cs и убедитесь, что для параметра контроллера установлен ваш контроллер по умолчанию, в противном случае контроллер по какой-то причине будет вызываться как бот для просмотра в папке области

public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "SomeArea_default",
            "SomeArea/{controller}/{action}/{id}",
            new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
        );
    }
1 голос
/ 29 июня 2012

Попробуйте этот код. Внести изменения в файл регистрации области ...

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" }
);
1 голос
/ 10 декабря 2010

У меня была та же проблема, и я решил ее, установив для свойства ascx 'Build Action' значение 'Embedded Resource'.

...