加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 在ASP MVC 6中为多个路由分配给同一个控制器或者动作

发布时间:2020-12-15 19:02:46 所属栏目:asp.Net 来源:网络整理
导读:题: 有没有办法在ASP.NET MVC 6应用程序中将两个不同的路由(带有参数)分配给同一个控制器? 我试过了: 我尝试使用多个路由属性到控制器类和单个操作,没有工作. 笔记: 我正在使用ASP.NET Core 1.0 RC1. 我想这样做的原因是,我希望api与旧版本的使用旧网址
题:

有没有办法在ASP.NET MVC 6应用程序中将两个不同的路由(带有参数)分配给同一个控制器?

我试过了:

我尝试使用多个路由属性到控制器类和单个操作,没有工作.

笔记:

>我正在使用ASP.NET Core 1.0 RC1.
>我想这样做的原因是,我希望api与旧版本的使用旧网址的移动应用兼容.

例:

[Produces("application/json")]
[Route("api/v2/Log")]
/// The old route is "api/LogFile" which I want to be still valid for this controller.
public class LogController : Controller {
    [HttpGet("{id}",Name = "download")]
    public IActionResult GetFile([FromRoute] Guid id) 
    {
        // ...
    }
}

在上面的例子中:api / LogFile / {some-guid}是旧路由,api / v2 / log / download / {some-guid}是新的路由.我需要两条路线调用相同的动作.

解决方法

在新的RC1应用程序中,控制器级别有两个路由属性可以正常工作:
[Produces("application/json")]
[Route("api/[controller]")]
[Route("api/old-log")]
public class LogController: Controller
{
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

http:// localhost:62058 / api / log和http:// localhost:62058 / api / old-log返回预期的json.我看到的唯一注意事项是,您可能需要设置属性的名称/顺序属性,以防您需要为其中一个操作生成URL.

有2个属性的动作也可以:

[Produces("application/json")]        
public class LogController : Controller
{
    [Route("api/old-log")]
    [Route("api/[controller]")]
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

但是,在控制器级别和特定操作路线上设置一般路由时,您需要小心.在这些情况下,控制器级别的路由被用作前缀,并被添加到url(有关这个行为here的很好的文章).这可能会让您得到一组不同于您期望的URL,例如:

[Produces("application/json")]
[Route("api/[controller]")]
public class LogController : Controller
{
    [Route("api/old-log")]
    [Route("")]
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}

在最后一种情况下,您的应用程序将侦听的2条路由将是http:// localhost:62058 / api / log和http:// localhost:62058 / api / log / api / old-log,因为api / log被添加为在动作级别定义的所有路由的前缀.

最后,另一个选择是为新路由使用属性,然后使用启动类中的路由表来提供照顾旧api的特定路由.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读