Я добавил область с названием home, переместил свой контроллер и просмотр на него, и теперь я не могу подключиться к представлению index

У меня уже есть контроллеры и представления в папках под названием проекта. Я добавил папку Area, а затем область внутри нее и назвал ее Home, а затем переместил в нее свой контроллер и индексное представление. Но когда я подключаюсь к индексу, я получаю сообщение об ошибке, и похоже, что путь, по которому он ищет индекс, - это старый путь, как мне изменить его на новый путь?

Вот что я создал

введите описание изображения здесь

В 'HomeAreaRegistration' я вижу это под RegstrationArea

public class HomeAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Home";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Home_default",
            "Home/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

Но когда я запускаю приложение в IE, вот что я вижу в браузере! Похоже, что он ищет index.cshtml в старом пути, а не новый путь в новой области 'Home'

введите описание изображения здесь

Похоже, что двигатель маршрута выглядит не в том месте. Вот как выглядит мой файл RouteConfig.cs.

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

Даже когда я пытаюсь " https://localhost:44301/Home/Index.cshtml", он выдает ошибку HTTP 404.

3 ответа

Ошибка 404 показывает основную проблему: маршрутизация по умолчанию и механизм поиска по умолчанию не могут быть найдены по умолчанию Index.cshtml просмотреть файл в Views каталог вашего проекта (т.е. ProjectName/Views/Index.cshtml указал по маршруту ~/Views/Home/Index).

Во-первых, создайте класс для включения поиска местоположения для вашей пользовательской области, как в следующем примере:

public class CustomView : RazorViewEngine
{
    public CustomView()
    {
        MasterLocationFormats: new[]
        {
            "~/Areas/Home/Views/{0}.cshtml",
            "~/Areas/Home/Views/{1}/{0}.cshtml"
        }

        ViewLocationFormats: new[]
        {
            "~/Areas/Home/Views/{0}.cshtml",
            "~/Areas/Home/Views/{1}/{0}.cshtml"
        }

        PartialViewLocationFormats = ViewLocationFormats;

        FileExtensions = new[]
        {
            "cshtml"
        };
    }
}

Затем включите все области и ваш пользовательский механизм просмотра в Global.asax:

protected void Application_Start()
{
    // register all area locations
    AreaRegistration.RegisterAllAreas();

    // clear default view engine
    ViewEngines.Engines.Clear();

    // add your custom view engine here
    // the custom view engine should loaded before default view engine (e.g. Razor)
    ViewEngines.Engines.Add(new CustomView());
    ViewEngines.Engines.Add(new RazorViewEngine());
}

Если у вас есть RouteConfig класс на App_Start каталог, убедитесь, что RegisterAllAreas включил перед маршрутом по умолчанию:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    AreaRegistration.RegisterAllAreas();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Кроме того, добавьте пространство имен имени контроллера, когда это требуется, или вышеупомянутое решение все еще не работает:

public class HomeAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Home";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Home_default",
            "Home/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "ProjectName.Areas.Home.Controllers" }
        );
    }
}

NB: Создать Home каталог под Views если вы хотите следовать правилам маршрута ~/Areas/Views/Home/Index, и положи Index.cshtml файл в него.

Рекомендации:

Как установить маршрут по умолчанию (в область) в MVC

Как зарегистрировать зоны для маршрутизации

Структура вашей области папок выглядит следующим образом

введите описание изображения здесь

Зарегистрируйте свой регион в Global.asax

AreaRegistration.RegisterAllAreas();

и попробуйте с этим URL

http://localhost:44301/Home/Home/Index

Вы должны сделать следующие исправления в своем решении:

1) Добавьте папку Home в Views и поместите в нее index.cshtml. Структура папки для просмотра должна быть следующей: Home(название области) > Views > Home (то же имя, что и у контроллера) > index.cshtml (как показано на рисунке)

введите описание изображения здесь

2) измените пространство имен вашего Homecontroller на (Имя решения).Areas.Home.Controllers

3) Также вы должны обратиться к следующей схеме маршрута для области:

localhost/AreaName/Controller/Action

который в вашем случае:

https://localhost:44301/Home/Home/Index

Надеюсь, что это может решить вашу проблему

Другие вопросы по тегам