【问题标题】:MVC attribute routing issuesMVC 属性路由问题
【发布时间】:2017-09-20 04:00:42
【问题描述】:

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

[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 然后被击中!

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您可以在操作上使用多个路由。

    [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,第二个路由将允许操作调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2016-11-01
      • 2013-10-28
      • 1970-01-01
      相关资源
      最近更新 更多