验证属性被触发两次

问题描述 投票:3回答:2

在我的MVC3应用程序中,我有模型(不删除不重要的属性):

public class AccountViewModel
{
    [StringLength(65)]
    public string Property1 { get; set; }

    [StringLength(65)]
    public string Property2 { get; set; }
}

问题是,当一个操作提交了两次调用的验证属性时,我可以总结出4个错误,而不是2个错误:

'Property1' length must be less than 65 characters
'Property1' length must be less than 65 characters
'Property2' length must be less than 65 characters
'Property2' length must be less than 65 characters

我未在控制器的代码中使用Validate方法。我的自定义属性也出现了问题,但“必需”属性却没有发生。我还要注意,自定义属性的ctor也称为两次

我的动作

[HttpPost]
public ActionResult CreateOrEdit(AccountViewModel model) {

    if (!ModelState.IsValid) {
        return View("Edit", model);
    }

    try {
        _accountService.InsertOrUpdate(model);

    }
    catch (Exception ee) {
        ModelState.AddModelError("", ee.Message);
        return View("Edit", model);
    }

    return RedirectToAction("Index");
}

在查看时,我使用以下方式呈现我的错误:

@{
    var errors = ViewData.ModelState.Errors();
    <div class="alert alert-block alert-error @(errors.Count == 0 ? "hide" : "")" > 
    <h4 class="alert-heading"> You got an error!</h4> 
    <ul>
        @foreach (var error in errors) {
            <li>@error</li>
        }
    </ul>
    </div>
}

并且我再次再次检查ViewData.ModelState已经包含两次错误。

asp.net-mvc-3 validation ninject ninject.web.mvc model-validation
2个回答
3
投票

问题在于集成Ninject。如果您使用Ninject.MVC包(我使用版本3),则在初始化时会注册自己的ModelValidationProvider并删除旧的:[]

Ninject.Web.Mvc.MvcModule

]中>
this.Kernel.Bind<ModelValidatorProvider>().To<NinjectDataAnnotationsModelValidatorProvider>();

Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin

public void Start()
{
    ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().Single());
    DependencyResolver.SetResolver(this.CreateDependencyResolver());
    RemoveDefaultAttributeFilterProvider();
}

因此,我没有创建我自己的IDependencyResolver实现(Ninject内核包装器),而是遵循此tutorial 要么您应该删除Ninject.MVC程序包,并从bin文件夹中删除其二进制文件。

此问题是由于不正确使用NInject引起的。

要解决此问题,请在NinjectWebCommonCreateKernel()方法中添加kernel.Rebind<ModelValidatorProvider>().To<NinjectDefaultModelValidatorProvider>();

这里是代码示例。

private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
                RegisterServices(kernel);
                GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
                kernel.Rebind<ModelValidatorProvider>().To<NinjectDefaultModelValidatorProvider>();
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

0
投票

此问题是由于不正确使用NInject引起的。

© www.soinside.com 2019 - 2024. All rights reserved.