MVC 属性路由问题

MVC attribute routing issues

我像这样装饰一个动作(在我的家庭控制器中):

[Route("view-book")]
public ActionResult ViewBook(int? id1, string id2)

在我看来,我使用 javascript:

填充一些超链接
tbody = tbody + '<a href="@Url.Action("ViewBook", "Home")/' + item.Id + '/' + item.Slug + '">View Book</a>';

使用上面的代码,超链接的 URL 可以正确呈现。例如:

https://localhost:44306/view-book/1/this-book

但是,ActionResult 没有被命中。所以,我将路由装饰更改为:

[Route("view-book/{id1:int?}/{id2}")]
public ActionResult ViewBook(int? id1, string id2)

现在 URL 呈现不正确,如下所示:

https://localhost:44306/Home/ViewBook/1/this-prop

但是,如果我像上面那样手动将 URL 更改为正确的 URL:

https://localhost:44306/view-book/1/this-prop

然后 ActionResult 被命中!

我该如何解决这个问题?

您可以在操作中使用多条路线。

[HttpGet]
[Route("view-book")] // Matches GET view-book
[Route("view-book/{id1:int?}/{id2}")] //Matches GET view-book/1/slug
public ActionResult ViewBook(int? id1, string id2) { ... }

这样,当您在 javascript 中构建路由时,第一条路由现在应该允许您之前呈现正确的 URL,因为 @Url.Action("ViewBook", "Home") 应该解析为 view-book,第二条路线将允许调用操作。