ASP.NET Представления корневого уровня маршрутизации MVC
-
20-08-2019 - |
Вопрос
Я думал, это будет довольно просто, но я совершенно сбит с толку.
Я хочу, чтобы представления одного контроллера находились на корневом уровне приложения, а не в подкаталоге для этого контроллера, но я не могу этого понять.
Я бы хотел иметь эти два URL-адреса:
/Info - Это должно привести к действию "Info" на контроллере "Home"
/Admin/ - Это должно быть действие "Index" (по умолчанию) на контроллере "Admin"
До сих пор, независимо от того, что я пробовал, первый маршрут в конечном итоге приведет к обоим.Кажется, я не могу разделить эти два понятия.
Этой информационной странице даже не нужен контроллер, она статична, но я действительно хочу использовать главную страницу.Возможно, есть гораздо более простой способ осуществить это, но я и этого пока не придумал.
Все, что я могу придумать, это создать информационный контроллер и переместить Views / Home /Info в Views / Info / Index, но это имеет определенный привкус.
Я смог сделать это в rails, используя:
map.connect ':controller/:action/:id'
map.connect ':action', :controller => 'home'
Решение
Вам просто нужны правильные маршруты.В вашем случае:
routes.MapRoute(
"Info",
"Info",
new { controller = "Home", action = "Info" }
routes.MapRoute(
"Admin",
"Admin",
new { controller = "Admin", action = "Index" }
Но я рекомендую вам это подходите.
Если вам нужно изменить физическое расположение views / partialviews по умолчанию,
проверьте Как сделать создавайте пользовательские механизмы просмотра.
Другие советы
Вы можете использовать атрибуты маршрута.
В вашем конфигурационном файле маршрута у вас должно быть.
routes.MapMvcAttributeRoutes();
AreaRegistration.RegisterAllAreas();
//code below should already be in your route config by default
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Тогда над каждым действием у вас может быть атрибут route.
[Route("info")]
Вы даже можете усовершенствовать эти атрибуты, добавив параметры и / или вложенные папки
[Route("blog/posts/{postId}")]
Вы можете поместить вышеупомянутый атрибут в любое действие, и оно будет выглядеть так, как если бы оно исходило из контроллера блога.Однако вам даже не нужен контроллер блога.Также {} обозначает параметр, поэтому просто убедитесь, что ваше действие принимает тот же параметр, что и в фигурных скобках.В этом случае параметром будет
string postId