Mvc6 路由(RoutePrefix 和 AreaPrefix)
Mvc6 routing (RoutePrefix and AreaPrefix)
我开始考虑将应用程序迁移到 MVC6 以利用新框架。我 运行 遇到的最大问题之一是路由(仅限属性路由,我已经完全删除了默认路由)。
我的应用程序通常是这样设置的:
Area/Administration/Controllers
Area/Customers/Controllers
/Controllers <- 非区域项目
在每个区域我都有一个基本控制器(例如 AdminBase、CustomerBase),它将包含带有 "AreaPrefix" 的 [Area] 标签,并且该区域中的每个控制器都将继承它并指定一个 [RoutePrefix]。
问题出现了,如果我想在路由中包含区域/控制器,每个 ActionResult 必须包含 [Route("[area]/[controller]/[action]")] 来产生输出,但是例如,如果我有一个 "ChangeAddress" 控制器,我会在 URL 中为它添加前缀 "change-address",但我看不出有什么办法,没有明确地将它放在控制器中的所有路由上如何实现?
在 MVC6 中你仍然有区域和前缀,它只是被降级为控制器级别的路由标签,并将动作路由放入 http 动词中。所以即
这个:
[RouteArea("AreaPrefix")]
[RoutePrefix("RoutePrefix")]
public class HomeController : Controller
{
...
[HttpGet]
[Route("LoginAction")]
public ActionResult Login() ....
变成
[Route("AreaPrefix/ControllerPrefix")]
public class HomeController : Controller
{
...
[HttpGet("LoginAction")]
public IActionResult Login() {
所以它更含糊,但我个人是自我牺牲路由过程的罪魁祸首,并且它使用 [] 表示法中的标准路由对象(将其视为之前的 {}) .但它仍然提供了一次指定分层并完成的控制级别,因此它现在提供了一个更简单的继承模型:
[Route("AreaPrefix/ControllerPrefix")
public class HomeOps : Controller // Controller Suffix is optional
{
}
[Route("api")]
public class HomeApiOps : HomeOps
{
// put the api AJAX methods here
[HttpPost("lookup")] // will route to // AreaPrefix/ControllerPrefix/api/lookup
public IActionResult Lookup() {
}
public class HomePageOps : HomeOps
{
// put similar routes for View returns, file content responses here
[HttpPost("lookup")] // Will route to AreaPrefix/ControllerPrefix/lookup
public IActionResult Lookup() {
}
这可以深入到一种更有条理的表达方式 'Unit of Work' 和
'Line of Business' 概念,您可以在其中轻松分组和分离 api 调用和页面,而无需庞大的控制器或无休止的#region trip ups。
通过这种继承,还请记住,您可以为每个区域创建一个根控制器 class 并为区域范围分层设置某些路由,然后继承到第二层的 "ControllerPrefix" 架空路由,并且只需要在每个动作上指定动作路由名称,它使用继承汇总将路由粘合在一起,将前面的示例变成 AreaPrefix/ControllerPrefix/Route
我完全支持 MVC6,我公司的客户端开发人员喜欢这个平台,在数据端,它使他们获得的信息简洁明了,但稀疏的文档可能会令人沮丧有时...希望这有帮助
我开始考虑将应用程序迁移到 MVC6 以利用新框架。我 运行 遇到的最大问题之一是路由(仅限属性路由,我已经完全删除了默认路由)。
我的应用程序通常是这样设置的:
Area/Administration/Controllers Area/Customers/Controllers /Controllers <- 非区域项目
在每个区域我都有一个基本控制器(例如 AdminBase、CustomerBase),它将包含带有 "AreaPrefix" 的 [Area] 标签,并且该区域中的每个控制器都将继承它并指定一个 [RoutePrefix]。
问题出现了,如果我想在路由中包含区域/控制器,每个 ActionResult 必须包含 [Route("[area]/[controller]/[action]")] 来产生输出,但是例如,如果我有一个 "ChangeAddress" 控制器,我会在 URL 中为它添加前缀 "change-address",但我看不出有什么办法,没有明确地将它放在控制器中的所有路由上如何实现?
在 MVC6 中你仍然有区域和前缀,它只是被降级为控制器级别的路由标签,并将动作路由放入 http 动词中。所以即
这个:
[RouteArea("AreaPrefix")]
[RoutePrefix("RoutePrefix")]
public class HomeController : Controller
{
...
[HttpGet]
[Route("LoginAction")]
public ActionResult Login() ....
变成
[Route("AreaPrefix/ControllerPrefix")]
public class HomeController : Controller
{
...
[HttpGet("LoginAction")]
public IActionResult Login() {
所以它更含糊,但我个人是自我牺牲路由过程的罪魁祸首,并且它使用 [] 表示法中的标准路由对象(将其视为之前的 {}) .但它仍然提供了一次指定分层并完成的控制级别,因此它现在提供了一个更简单的继承模型:
[Route("AreaPrefix/ControllerPrefix")
public class HomeOps : Controller // Controller Suffix is optional
{
}
[Route("api")]
public class HomeApiOps : HomeOps
{
// put the api AJAX methods here
[HttpPost("lookup")] // will route to // AreaPrefix/ControllerPrefix/api/lookup
public IActionResult Lookup() {
}
public class HomePageOps : HomeOps
{
// put similar routes for View returns, file content responses here
[HttpPost("lookup")] // Will route to AreaPrefix/ControllerPrefix/lookup
public IActionResult Lookup() {
}
这可以深入到一种更有条理的表达方式 'Unit of Work' 和 'Line of Business' 概念,您可以在其中轻松分组和分离 api 调用和页面,而无需庞大的控制器或无休止的#region trip ups。
通过这种继承,还请记住,您可以为每个区域创建一个根控制器 class 并为区域范围分层设置某些路由,然后继承到第二层的 "ControllerPrefix" 架空路由,并且只需要在每个动作上指定动作路由名称,它使用继承汇总将路由粘合在一起,将前面的示例变成 AreaPrefix/ControllerPrefix/Route
我完全支持 MVC6,我公司的客户端开发人员喜欢这个平台,在数据端,它使他们获得的信息简洁明了,但稀疏的文档可能会令人沮丧有时...希望这有帮助