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;

这将构建我的东西,例如

http://localhost/API/Reporting/EndPoint?Ids=b94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

端点使用[FromUri]属性接受使用uri构建它的请求对象。

public TheResponse EndPoint([FromUri] TheRequest request)

TheRequestIEnumerable<Guid> Ids {get;set;}类型的财产。

但是,Ids属性始终是一个空数组,其中包含空Guid

怎么能实现这一目标?我需要自定义模型绑定吗?

根据要求,这是我的请求对象的样子:

public class TheRequest
{
    public IEnumerable<Guid> Ids { get; set; }
}
答案

现在我根据这种情况模拟了一个集成测试。默认的[FromUri]模型绑定器有问题绑定Guids,因为你现在在查询字符串中有它们,因为它只读取一个长字符串

94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

它无法解析为有效的Guid。因此收集一个空的Guiddefault(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 返回空模型

NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)

Dapper 映射结果列表

模型绑定

使宽度为 1fr + 1fr = 2fr(有网格间隙)

创建从 linq 到 SQL 查询输出的特定 json 响应?