3

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

4

2 回答 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 Kernel 包装器),而是按照本教程进行 操作,或者您应该删除 Ninject.MVC 包并从 bin 文件夹中删除其二进制文件。

于 2012-04-13T07:59:27.493 回答
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;
            }
        }
于 2020-05-13T08:44:19.980 回答