我使用DTO对象作为我的JSON REST Web服务请求的参数,该Web服务正从WCF迁移。
要获得id=1
或id=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;
}
}
我是否可以通过某种方式指示模型绑定器如何绑定此类属性?