Я новичок в области и маршрутизации URL-адресов в MVC, поэтому я не уверен, что мне нужно сделать здесь, чтобы получить результат, который я ищу.
У меня есть область под названием Policy
, внутри которой у меня есть три контроллера: PolicyController
, GroupController
и SectionController
.
Проблема с этим возникает, когда я хочу, например, перейти к деталям политики, URL-адрес выглядит так: http://www.example.com/Policy/Policy/Detail/1
, но вместо этого я хотел бы, чтобы он выглядел так: http://www.example.com/Policy/Detail/1
Я видел несколько примеров того, как полностью скрыть область из URL-адреса, но я бы не хотел этого делать. Как я бы хотел видеть http://www.example.com/Policy/Group/Index
или http://www.example.com/Policy/Section/Index
Другими словами, я хотел бы скрыть только имя области, когда я использую контроллер, имя которого совпадает с именем области.
Возможно ли это сделать?
2 ответа
Вы можете определить контроллер по умолчанию в качестве точки входа в вашем регионе, но вы не можете пропустить имя контроллера при маршрутизации. В противном случае вам пришлось бы создать маршрут по умолчанию для каждого действия в контроллере политики:
public override void RegisterArea(AreaRegistrationContext context)
{
// Entry point for each action on Policy controller
context.MapRoute(
"Policy_default_detail",
"Policy/Detail/{id}",
new { controller = "Policy", action = "Detail", id = UrlParameter.Optional }
);
context.MapRoute(
"Policy_default_anotheraction",
"Policy/AnotherAction/{id}",
new { controller = "Policy", action = "AnotherAction", id = UrlParameter.Optional }
);
// Default entry point
context.MapRoute(
"Policy_default",
"Policy/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
Обратной стороной этой конструкции является то, что у вас не может быть контроллера с тем же именем, что и у действия на контроллере политики.
Я предлагаю вам переосмыслить именование областей, чтобы название области не совпадало с названиями контроллеров.
Вы можете добавить конкретное определение маршрута в свой класс регистрации области перед общим кодом регистрации области.
public class PolicyAreaRegistration : AreaRegistration
{
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Policy_Tricky",
"Policy/{action}/{id}",
new { action = "Index", controller = "Policy", id = UrlParameter.Optional },
new string[] { "YourProjectName.Areas.Policy.Controllers" }
);
context.MapRoute(
"Policy_default",
"Policy/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional },
new string[] { "YourProjectName.Areas.Policy.Controllers" }
//Providing namespace while defining route to prevent conflict
);
}
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.