Я добавил область с названием 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
файл в него.
Рекомендации:
Структура вашей области папок выглядит следующим образом
Зарегистрируйте свой регион в 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
Надеюсь, что это может решить вашу проблему