带有查询参数的 MVC 属性路由不起作用

Posted

技术标签:

【中文标题】带有查询参数的 MVC 属性路由不起作用【英文标题】:MVC Attribute Routing with query parameter not working 【发布时间】:2021-12-12 13:51:30 【问题描述】:

我正在尝试将我的 UI 项目和 WebAPI 项目合二为一,以使其更易于维护,但是我收到以下路由错误:


    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:64182/api/v1/business?id=101'.",
    "MessageDetail": "No type was found that matches the controller named 'api'."

我已在方法上添加了属性路由以使其工作,但它仅适用于以下 url:

MVC 动作:

[HttpGet, Route("api/v1/business/id:int")]
public IHttpActionResult Get([FromUri]int? id)

....

http://localhost:64182/api/v1/business/101

预期的 url 签名不能更改,它仍应使用查询参数:

http://localhost:64182/api/v1/business?id=101

在 Route 属性中,我不能添加问号,因为它是不允许的。

该系统已被许多用户使用,很遗憾我无法更改签名,否则会破坏他们的系统。

我怎样才能让它工作,或者我可以使用什么路由模板来包含查询参数?

【问题讨论】:

【参考方案1】:

我认为 [FromUri] 属性已被弃用。尝试使用 [FromRoute]。另外,我将从控制器类构建我的路由。

以下是http://localhost:64182/api/v1/business/101

[Route("api/v1/[controller]")]
[ApiController]
public class Business : ControllerBase


    [HttpGet("/id:int")]
    public async Task<ActionResult<YourBusinessDto>> Get([FromRoute] int id)
    
        //Your code to get your business dto here.
    

以下是http://localhost:64182/api/v1/business?id=101

[Route("api/v1/[controller]")]
[ApiController]
public class Business : ControllerBase


    [HttpGet]
    public async Task<ActionResult<YourBusinessDto>> Get([FromQuery] int id)
    
        //Your code to get your business dto here.
    

【讨论】:

【参考方案2】:

在我们的订单集合中,每个订单都有一个唯一的标识符。我们可以去集合并通过“id”请求它。典型的 RESTful 最佳实践,这可以通过它的路由来检索,例如“api/orders/1”

//api/orders/1
   [HttpGet("api/orders/id")]
            public string test1([FromRoute]int id)
            
                return "test1";
            

此属性将指示 ASP.NET Core 框架将此操作视为 HTTP GET 动词的处理程序并处理路由。我们提供端点模板作为属性参数。此模板用作框架将用于匹配传入请求的路由。在这个模板中,id​​​​的值对应于路由部分作为“id”参数。 FromRoute 属性告诉框架在路由(URL)中查找“id”值并将其作为 id 参数提供。

此外,我们可以很容易地编写它来使用 FromQuery 属性。然后,这会指示框架使用“标识符”名称和相应的整数值来预测查询字符串。然后将该值作为 id 参数传递给操作。其他一切都一样。

不过,最常用的方法是前面提到的 FromRoute 用法——标识符是 URI 的一部分

//api/orders?id=1
    [HttpGet("api/v1")]
            public string test2([FromQuery]int id)
            
                return "test2";
            

另外,更多属性使用可以参考这篇详细文章,可能对你有帮助:

https://www.dotnetcurry.com/aspnet/1390/aspnet-core-web-api-attributes

【讨论】:

以上是关于带有查询参数的 MVC 属性路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用属性路由时查询字符串不起作用

客户端验证在带有 Bootstrap 的 ASP.NET MVC5 中不起作用

Window.Location.Href 或其他重定向 _self 的方法不起作用(MVC 视图)

使用多个参数(字符串、日期时间)的路由不起作用

聚合物Ajax绑定路由参数不起作用

带有.NET MVC的jQuery getJSON不起作用