目标:我正在设计一个REST API,它允许用户在HTTP GET请求的查询字符串上传递参数。喜欢的东西Swagger未调用WebAPI Custom ModelBinder
http://fake.api.com/search?param1=123¶m2=car&pageSize=10
实施:在服务器端我有一个自定义的模型绑定是得到请求的查询字符串参数,并将其转换为C#对象,这样我的控制器的操作方法并没有解析请求参数。 所以控制器的操作方法的签名看起来像
public async Task<HttpResponseMessage> Get([ModelBinder]RequestObject request)
当我测试从提琴手API和传递的查询字符串值,自定义模型绑定的作品,我也得到与控制器动作正确的价值观C#的对象。
但是,当我用Swagger进行测试时,modelbinder不会被调用,并且值在action参数中为null。模型参数单独显示,而不是显示模型。
我该如何解决这个问题?
我的自定义模型绑定器:
public class RequestObjectModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(RequestObject))
{
return false;
}
var searchCriteria = new RequestObject();
var type = searchCriteria.GetType();
var querystringVals = actionContext.Request.GetQueryNameValuePairs();
var keyValuePairs = querystringVals as IList<KeyValuePair<string, string>> ?? querystringVals.ToList();
if (!keyValuePairs.Any())
{
bindingContext.Model = searchCriteria;
return true;
}
foreach (var value in keyValuePairs)
{
var key = value.Key;
var prop = type.GetProperty(key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (prop == null)
{
continue;
}
prop.SetValue(searchCriteria, Convert.ChangeType(value.Value,prop.PropertyType), null);
}
var validationResults = new Collection<ValidationResult>();
var isValid = Validator.TryValidateObject(searchCriteria, new ValidationContext(searchCriteria, null, null), validationResults, true);
if (!isValid)
{
foreach (var result in validationResults)
{
bindingContext.ModelState.AddModelError("", result.ErrorMessage);
}
}
bindingContext.Model = searchCriteria;
return true;
}
不,它不起作用。抛出以下错误:“消息”:“发生错误。”,“ExceptionMessage”:“无法绑定参数'searchCriteria',因为它具有冲突的属性。” –