简体   繁体   English

ASP.NET WEB API 2 - 每个请求触发两次模型绑定

[英]ASP.NET WEB API 2 - ModelBinding Firing twice per request

I have a custom validation attribute, that when I make a request to the server via a POST, is firing the IsValid method on the attribute twice.我有一个自定义验证属性,当我通过 POST 向服务器发出请求时,会在该属性上触发两次 IsValid 方法。

Its resulting in the error message returned to be duplicated.它导致错误消息返回重复。

I've checked using Fiddler that the request is only ever fired once, so the situation is 1 request with model binding firing twice.我已经使用 Fiddler 检查过请求只被触发一次,所以情况是 1 个请求,模型绑定触发两次。

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class MinimumAgeAttribute : ValidationAttribute
{
    private readonly int _minimumAge;

    public MinimumAgeAttribute(int minimumAge)
    {
        _minimumAge = minimumAge;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        DateTime date;

        if (DateTime.TryParse(value.ToString(), out date))
        {
            if (date.AddYears(_minimumAge) < DateTime.Now)
            {
                return ValidationResult.Success;
            }
        }

        return new ValidationResult("Invalid Age, Clients must be 18 years or over");
    }
}

The problem was with Ninject, it was doubling up the number of ModelValidatorProviders.问题出在 Ninject 上,它使 ModelValidatorProvider 的数量翻了一番。

I've added this binding to prevent the problem.我已经添加了这个绑定来防止这个问题。

container.Rebind<ModelValidatorProvider>().To<NinjectDefaultModelValidatorProvider>();

The problem was indeed caused by Ninject.问题确实是由 Ninject 引起的。 There are two model validator providers that register the validation attributes ModelValidatorProvider and NinjectDefaultModelValidatorProvider .有两个模型验证器提供程序注册验证属性ModelValidatorProviderNinjectDefaultModelValidatorProvider In my case I only unbinded the ModelValidatorProvider in the Ninject configuration file, under the creation of a new Kernel:在我的情况下,我只在 Ninject 配置文件中ModelValidatorProvider ,在创建新内核的情况下:

var kernel = new StandardKernel();
kernel.Unbind<ModelValidatorProvider>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM