验证属性被触发两次

时间:2012-04-12 18:34:47

标签: asp.net-mvc-3 validation ninject ninject.web.mvc model-validation

在我的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已经包含两次错误。

2 个答案:

答案 0 :(得分: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 Kernel wrapper)实现,而是遵循了这个tutorial 要么 你应该删除Ninject.MVC包并从bin文件夹中删除它的二进制文件。

答案 1 :(得分:0)

此问题是由于不正确使用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;
            }
        }