Подтвердить что ты не робот

Область MVC - Вид не найден

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

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 

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Для тех, кто ищет решение .net core, используйте

 app.UseMvc(routes =>
    {
      routes.MapRoute(
        name : "areas",
        template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
      );
    });'

Если у вас есть некоторый код в основном проекте и некоторый код в областях, используйте следующий код.

app.UseMvc(routes => {
            routes.MapRoute(
                name: "areas",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

Обратите внимание, что в контроллере определены области

 [Area("Test")]
public class TestController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

}