2010-04-12 3 views
12

У меня есть проект, который использует области MVC. В области есть весь проект, в то время как основные папки «Представления/Контроллеры/Модели» за пределами Областей пусты, запрет диспетчера диспетчеризации, который у меня настроен, который направляет входящие запросы по умолчанию на главный контроллер в моей области.MVC Areas - View not found

Этот контроллер имеет один метод следующим образом: -

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()» метода [например, вернуть View («л», объект)] он ищет зрения в корень проекта, а не в конкретной папке просмотра.

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

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

ответ

3

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

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

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

+0

Это делается по умолчанию в веб-приложении ASP.NET MVC 2 в VS2008. Это часть настройки по умолчанию для global.asax – user314827

+0

См. Мое редактирование .... –

+0

Hi Robert, Я проверил все пространства имен контроллеров. Все они совпадают с тем, что должно быть, это ProjectName.Areas.AreaName.Controllers. – user314827

7

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

+3

Пожалуйста, отметьте это как ваш ответ. –

+0

У меня была аналогичная проблема. В моем случае у моей ссылки не было имени области на пути, и даже если был вызван правильный контроллер, представление не удалось найти. Эта ситуация оставляет мне вопрос о том, как вызван контроллер. –

1

Проверьте сгенерированный код на MyArea AreaRegistration.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 } 
     ); 
    } 
+0

Спасибо! Это исправило это для меня с помощью ASP.NET MVC 5. –

1

Я просто была такая же проблема и решить ее, установив «Build Action» свойство ASCX к «Внедренный ресурс».

1

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

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" } 
); 
6

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

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

тогда вы не необходимо явно указать вашу область в любой ссылке ...

+1

Этот вид работал для меня, но с другой проблемой. Маршрут попадает в правильный контроллер, но вид не найден (он ищет в главном каталоге проекта для представления по умолчанию, а не в области, что мне и нужно). – JSideris

+0

@jSideris у меня такой же проблема. как вы решили эту проблему? –

1

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

[RouteArea("Xyz", AreaPrefix = "")] 
public class XyzController : Controller 
{ 
... 
}