Mvc6路由(RoutePrefix和AreaPrefix)

时间:2015-07-20 16:26:54

标签: c# asp.net-mvc routing attributerouting

我开始考虑将应用程序移到MVC6上以利用新框架。我遇到的最大问题之一是路由(仅限属性路由,我已完成删除默认路由)。

我的应用程序通常设置如下:

区/管理/控制器 地区/客户/控制器 /控制器< - 非区域项目

在每个区域中,我都有一个基本控制器(如AdminBase,CustomerBase),它将包含带有“AreaPrefix”的[Area]标签,该区域中的每个控制器将继承它并指定[RoutePrefix]。

如果我想在路径中包含区域/控制器,每个ActionResult必须包含[Route(“[area] / [controller] / [action]”)]来产生输出,那么问题就出现了,但是,如果,例如,我有一个“ChangeAddress”控制器,我会在URL中将其作为“更改地址”的前缀,但我看不出办法,没有明确地将它放在控制器中的所有路径上如何实现这一点?

1 个答案:

答案 0 :(得分:8)

在MVC6中,你仍然有区域和前缀,它只是被降级为控制器级别的Route标签,并将动作路由放入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() {

}

这可以深入分析表达“工作单位”的更有条理的方式。和 '业务线'这些概念,你可以轻松地分组api调用和页面,而不需要庞大的控制器或无休止的#region旅行。

通过这种继承,还要记住,你可以为每个区域创建一个根控制器类,并为区域范围的分层设置某些路由,然后继承到第二层,用于" ControllerPrefix"开销路由,只需要在每个操作上指定操作路由名称,它使用继承汇总将路由粘合在一起,将前面的示例转换为AreaPrefix / ControllerPrefix / Route

我和你一起使用MVC6,我的业务客户端开发人员喜欢这个平台,而在数据端,它使得他们的信息干净简单,但稀疏的文档会令人沮丧有时...希望这有帮助