WebAPI Modelbinding - [FromUri]没有处理Guids的枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebAPI Modelbinding - [FromUri]没有处理Guids的枚举相关的知识,希望对你有一定的参考价值。
我正在尝试构建一个RESTApi端点,用户可以发送多个ID来过滤特定资源。
因此,我创建了一个请求对象,可以在我自己的项目中重用,以保持简单(至少对我而言)。
在构建GET调用QueryString时,我检查请求对象属性是否为IEnumerable
。如果是这样,我会将值附加如下:
var collection = new NameValueCollection();
foreach (var pi in request.GetType().GetProperties().Where(p => p.CanRead && p.CanWrite))
{
var propVal = pi.GetValue(request, null);
if (propVal == null)
continue;
if (pi.PropertyType.IsArray || typeof(IEnumerable).IsAssignableFrom(pi.PropertyType))
{
var enumerable = propVal as IEnumerable;
if (enumerable != null)
{
foreach (var singleValue in enumerable)
{
collection.Add(pi.Name, singleValue.ToString());
}
}
}
else
{
collection.Add(pi.Name, propVal.ToString());
}
}
return collection;
这将构建我的东西,例如
端点使用[FromUri]
属性接受使用uri构建它的请求对象。
public TheResponse EndPoint([FromUri] TheRequest request)
而TheRequest
有IEnumerable<Guid> Ids {get;set;}
类型的财产。
但是,Ids属性始终是一个空数组,其中包含空Guid
。
怎么能实现这一目标?我需要自定义模型绑定吗?
根据要求,这是我的请求对象的样子:
public class TheRequest
{
public IEnumerable<Guid> Ids { get; set; }
}
现在我根据这种情况模拟了一个集成测试。默认的[FromUri]
模型绑定器有问题绑定Guid
s,因为你现在在查询字符串中有它们,因为它只读取一个长字符串
94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747
它无法解析为有效的Guid
。因此收集一个空的Guid
(default(Guid)
或Guid.Empty
)。
但是如果查询字符串是这样提供的:
/ API /报表/端点?IDS = b94a3f1b-15CD-4feb-AC34-bd58bc1c3c2b&IDS = 77dc84ac-4d48-4cbd-ba12-9de3108a5747
通过将它们分成单独的参数?Ids={guid}&Ids={guid}
并对其进行测试,请注意将使用填充的正确参数调用端点。
因此,要么更改URL的构造方式,要么无法更改当前格式,请创建自定义模型绑定器以根据需要解释查询字符串。
对于自定义模型绑定从这里开始Parameter Binding in ASP.NET Web API
以上是关于WebAPI Modelbinding - [FromUri]没有处理Guids的枚举的主要内容,如果未能解决你的问题,请参考以下文章
MVC3 & JSON.stringify() ModelBinding 返回空模型