我正在尝试将一个值传递给使用ASP.Net Core 6 API创建的端点,其中包含以下详细信息:
控制器,操作&型号
[ApiController]
[Route("api/test")]
public class TestController
{
[HttpGet]
public bool Get([FromQuery] Filter filter)
{
return true;
}
}
public class Filter
{
public object Equal { get; set; }
}
请求URL
https://localhost:7134/api/test?Equal=50
如您所见,Equal
属性的类型为object
。
注意
这是我面临的情况的简化版本,Filter
模型我无法更改。
问题
如何在不编写自定义模型绑定器的情况下将50
绑定到filter
对象的Equal
属性?
因此,我能够通过使用Json Serializers的技巧来实现目标。
控制器,操作&型号
[ApiController]
[Route("api/test")]
public class TestController : Controller
{
[HttpGet]
public bool Get([FromQuery] Filter filter)
{
filter = Request.Query.ExtractFilter();
return true;
}
}
public class Filter
{
public object Equal { get; set; }
}
扩展方法
public static class QueryCollectionExtensions
{
public static Filter ExtractFilter(
this IEnumerable<KeyValuePair<string, StringValues>> queryCollection)
{
Filter result = new();
if (!queryCollection.TryGetByKey("filter", out StringValues filter))
{
return result;
}
if (!filter.Any())
{
return result;
}
result = JsonConvert.DeserializeObject<Filter>(filter);
return result;
}
public static bool TryGetByKey(
this IEnumerable<KeyValuePair<string, StringValues>> queryCollection,
string key, out StringValues values)
{
values = string.Empty;
KeyValuePair<string, StringValues> keyValuePair = queryCollection
.FirstOrDefault((KeyValuePair<string, StringValues> x) => x.Key == key);
if (keyValuePair.Equals(default(KeyValuePair<string, StringValues>)))
{
return false;
}
values = keyValuePair.Value;
return true;
}
}
请求URL
https://localhost:7134/api/test?filter={"Equal":50}
https://localhost:7134/api/test?filter={"Equal":"abc"}
我相信您想要的语法是:
https://localhost:7134/api/test?Filter.Equal=50
把它作为另一个参数传递怎么样?
例如:
[HttpGet]
public bool Get([FromQuery] int Equal, [FromQuery] Filter filter)
{
if (null == filter)
{
filter = new Filter();
}
filter.Equal = Equal;
return true;
}