【问题标题】:Mvc6 routing (RoutePrefix and AreaPrefix)Mvc6 路由(RoutePrefix 和 AreaPrefix)
【发布时间】:2015-10-09 21:04:20
【问题描述】:

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

我的应用程序通常是这样设置的:

区域/管理/控制器 区域/客户/控制器 /Controllers

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

出现的问题是,如果我想在路由中包含区域/控制器,则每个 ActionResult 必须包含 [Route("[area]/[controller]/[action]")] 以生成输出,但是如果,例如,我有一个“ChangeAddress”控制器,我会在 URL 中将其前缀为“change-address”,但我看不到任何方法,如果没有明确地将它放在控制器中的所有路由上如何实现这一点?

【问题讨论】:

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


    【解决方案1】:

    在 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() {
    
    }
    

    这可以深入到一种更有条理的方式来表达“工作单元”和 “业务线”概念,您可以轻松地对 API 调用和页面进行分组和分离,而无需庞大的控制器或无休止的#region 行程。

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

    我支持您全面使用 MVC6,我公司的客户端开发人员喜欢这个平台,而在数据端,它使他们的信息变得简洁明了,但稀疏的文档有时会令人沮丧...希望这会有所帮助

    【讨论】:

    • 感谢您提供此信息,该方法效果很好,但有一个例外。我在 Chrome 上浏览了我的应用程序,每个页面视图都发送了 HTTPHEAD 请求,导致网站上记录了一个错误。出于这个原因,我的 MVC5 应用程序在 HttpGets 上只有 [Route],然后指定一个帖子。我还没有确定在 MVC6 中实现这一点的方法,因为它会覆盖控制器上的路由:(
    • 我从来没有见过这个,我很抱歉——但显然这已经改变了更多:如果你仍然有问题,请记住如果你在 Action Method 上指定了动词,你可以用逗号分隔:[HttpGet ("name"), HttpHead("Name")],如果你恢复使用 Route[("name")] 你必须在控制器级别指定:[Route("controllerName/[action]")]
    猜你喜欢
    • 2015-06-21
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2015-03-17
    相关资源
    最近更新 更多