使用aspnet-api-versioning时,MVC Core覆盖路由会破坏Url.RouteUrl辅助方法

时间:2018-04-11 15:38:20

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

在MVC Core Web应用程序中,使用“〜”覆盖控制器方法上的路由前缀似乎打破了Url.RouteUrl帮助程序方法。它返回null而不是正确的路由。

示例:

[Route("v{api-version:apiVersion}/[controller]")]
public class BooksController : ApiController
{
    [HttpGet]
    [Route("{bookId}", Name = "GetBook")]
    public Book GetBook( int bookId )
    {
    }

    // GET /v1/authors/1/books
    [HttpGet]
    [Route("~/v{api - version:apiVersion}/authors/{authorId:int}/books")]
    public IEnumerable<Book> GetByAuthor(int authorId)
    {
        // do some stuff
        string route = Url.RouteUrl( "GetBook", new { id = 1 });
    }
}

我相信上面的例子会显示问题。从Url.RouteUrl()返回的路由为空。如果不使用版本控制,并从路由中删除“”,RouteUrl()方法将正确地将URL返回到GetBook方法。 它添加了aspnet-api版本的nuget包,它以某种方式引起了问题。

如何让RouteUrl在这个实例中工作?

1 个答案:

答案 0 :(得分:0)

好的,偶然发现了答案。不知道为什么这解决了问题,但改变了路线:

[路线(“〜/ v {api - version:apiVersion} / authors / {authorId:int} / books”)]

为:

〔路线( “〜/ V {版本:apiVersion} /作者/ {AUTHORID:整数} /书籍”)]

修复了问题。