我知道如何在GET请求中向端点/resources
添加对Query参数的支持。那将是:
[HttpGet]
public async Task<IHttpActionResult> GetAll([FromUri] QueryData queryData) {
//... Do some stuff
}
在我的示例中,QueryData
将是一个包含我所有支持的查询参数的类:
public class QueryParam {
public int Page { get; set; }
public int Size { get; set; }
}
那么,我可以调用端点:/resources?page=2&size=4
,并成功检索这些参数。
但是,在端点上做同样的事情:/resources/2
??
2
是网址的一部分,用于指定资源的id
。
目前,我正在按如下方式处理该方法:
[HttpGet]
public async Task<IHttpActionResult> Get(int id) {
//Do some stuff...
}
这很好,但后来我尝试将其修改为:
[HttpGet]
public async Task<IHttpActionResult> Get(int id, [FromUri] QueryData queryData) {
//Do some stuff...
}
我希望它能像在其他方法上那样工作,但事实并非如此。可能是因为id
,它不是由查询参数检索的,而是URL路径的一部分。
是否可以将查询参数添加到此类网址,并且能够同时检索id
和这些参数?
我期待能够呼叫端点:/resources/2?lang=en
答案 0 :(得分:1)
实现目标的一种方法是手动阅读id
,如下所示:
[HttpGet]
public async Task<IHttpActionResult> Get(int id, [FromUri]QueryData queryData) {
id = RouteData.Values["id"];
}
或
[HttpGet]
public async Task<IHttpActionResult> Get([FromUri]QueryData queryData) {
var id = RouteData.Values["id"];
}
如果MVC对模糊性大吼大叫,请添加如下路径约束:
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"},
new {productId = @"\d+" }
);
您可以尝试的另一件事是将ID添加为QueryData属性。它可以填充它!
答案 1 :(得分:0)
我能够使用以下代码正确解析路由值和查询字符串值的Web API 2.2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using WebAPITest.Models;
namespace WebAPITest.Controllers
{
public class ValuesController : ApiController
{
// GET api/values/5
public async Task<IHttpActionResult> Get(int id, [FromUri] QueryParam queryData)
{
return Ok("value");
}
}
}
型号:
using System;
namespace WebAPITest.Models
{
public class QueryParam
{
public int Page { get; set; }
public int Size { get; set; }
}
}
我将默认的 ValuesController 调整为使用IHttpActionResult
而不是字符串。如果要区分路由,可以添加属性路由并使用各自的HTTP方法装饰每个操作。您不必直接修改路由或在控制器操作中执行任何额外的参数解析。