没有调用自定义HttpParameterBinding
本文关键字:HttpParameterBinding 自定义 调用 | 更新日期: 2023-09-27 18:16:24
我添加了一个自定义参数绑定到我的ASP.net MVC应用程序(版本5.2.0),通过添加以下到Global.asax.cs
GlobalConfiguration.Configuration.ParameterBindingRules.Insert(0, desc => new NewtonsoftParameterBinding(desc));
NewtonsoftParameterBinding
定义为
public class NewtonsoftParameterBinding : HttpParameterBinding
{
private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings();
public NewtonsoftParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor) {}
public override bool WillReadBody
{
get { return true; }
}
public override async Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext,
CancellationToken cancellationToken)
{
var theString = await actionContext.Request.Content.ReadAsStringAsync();
actionContext.ActionArguments[Descriptor.ParameterName] = JsonConvert.DeserializeObject(theString, Descriptor.ParameterType, _serializerSettings);
}
}
所以我希望这能让我在我的MVC模型字段上使用像JsonProperty
这样的东西,但它从来没有调用过。有人知道我如何才能正确注册自定义ParameterBindingRules
吗?
将HttpParameterBinding全局地添加到ParameterBindingRules将尝试以这种方式绑定所有操作中的所有参数。你所有的参数都是object类型吗?
我希望我在这里没有错过一些重要的东西,但是如果你有一个类型为int
的动作参数,你怎么能把它分配给任何反序列化返回(这是一个object
)?
考虑从ParameterBindingAttribute
派生。这样,您就可以将绑定逻辑应用到有意义的地方。
首先重写GetBinding方法:
public override HttpParameterBinding GetBinding(HttpParameterDescriptor httpParamDescriptor)
然后使用HttpParameterDescriptor来检查它的类型是否有意义(在你的情况下,它应该是'object')。
if(httpParamDescriptor.ParameterType == typeof(object))
{
return new NewtonSoftParameterBinding();
}
else
{
//indicate that this binding doesn't work for non-object types as follows
return httpParamDescriptor.BindAsError("works with params of object type only");
}