[FromUri]对象中的自定义属性绑定

时间:2017-02-28 14:38:03

标签: c# asp.net-mvc asp.net-web-api2

我使用DTO对象作为我的JSON REST Web服务请求的参数,该Web服务正从WCF迁移。

要获得id=1id=3的产品,我一直在使用此Uri:

http://example.com/products?ids=1,3

为简单起见,我想将现有的DTO类用作我的控制器方法的[FromUri]参数。例如:

[HttpGet]
[Route("products")]
public IHttpActionResult GetProducts([FromUri] GetProductRequestParameters parameters)
{
    ...
}

这就是DTO:

public class GetProductRequestParameters
{
    public IEnumerable<int> Ids { get; set; }

    public int FamilyId { get; set; }
}

问题在于,对于属性?Ids=1&Ids=3

,模型绑定器需要?Ids=1,3而不是像IEnumerable<int>这样的“逗号分隔值”

如果我在控制器方法中使用查询字符串参数而不是DTO,则使用以下代码实现绑定此类数据。我更喜欢使用后者,因为DTO可以有很多属性,我不想手动填写每个参数。

internal class CommaSeparatedIntegerCollectionModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (val == null)
        {
            return false;
        }

        string s = val.AttemptedValue;

        if (s == null || s.IndexOf(",", StringComparison.Ordinal) == 0)
        {
            bindingContext.Model = new int[] { };
        }

        var stringArray = s.Split(new[] { "," }, StringSplitOptions.None);
        var listInt = new List<int>(stringArray.Count());
        int valueInt;
        foreach (string valueString in stringArray)
        {
            if (!int.TryParse(valueString, out valueInt))
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Values are not numeric");
                return false;
            }

            listInt.Add(valueInt);
        }

        bindingContext.Model = listInt;

        return true;
    }
}

我是否可以通过某种方式指示模型绑定器如何绑定此类属性?

0 个答案:

没有答案