没有调用自定义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

将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");
}
相关文章:
  • 没有找到相关文章