隐藏单个控制器的区域名称
Hide area name for single controller
我对 Areas 和 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
换句话说,我只想在使用与区域同名的控制器时隐藏区域名称。
这可能吗?
您可以在区域注册中添加特定路线定义 class 在通用区域注册代码之前。
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
);
}
}
您可以将默认控制器定义为您所在区域的入口点,但您不能在路由中跳过控制器名称。否则,您必须为策略控制器中的每个操作创建一个默认路由:
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 }
);
}
此设计的缺点是您不能拥有与策略控制器上的操作同名的控制器。
我建议你重新考虑区域命名,使区域名称与控制器名称不匹配。
我对 Areas 和 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
换句话说,我只想在使用与区域同名的控制器时隐藏区域名称。
这可能吗?
您可以在区域注册中添加特定路线定义 class 在通用区域注册代码之前。
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
);
}
}
您可以将默认控制器定义为您所在区域的入口点,但您不能在路由中跳过控制器名称。否则,您必须为策略控制器中的每个操作创建一个默认路由:
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 }
);
}
此设计的缺点是您不能拥有与策略控制器上的操作同名的控制器。
我建议你重新考虑区域命名,使区域名称与控制器名称不匹配。