ASP.Net Core 6 HttpGet API ==> 如何将 [FromQuery] 参数绑定到 C# 对象数据类型



我正在尝试将一个值传递给使用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;
}

最新更新