asp.net-mvc-3 - 验证属性被触发两次

标签 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; }
}

问题是当一个 Action 被提交时验证属性被调用两次,我可以总结出 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

我没有在我的 Controller 代码中使用 Validate 方法。该问题也出现在我的自定义属性中,但它不会发生在 Required 属性中。另外我必须注意,自定义属性的 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");
}

在 View 中,我使用以下方式呈现我的错误:

@{
    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 已经两次包含错误。

最佳答案

问题在于集成 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 文件夹中删除它的二进制文件。

关于asp.net-mvc-3 - 验证属性被触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10129669/

相关文章:

java - 更好地处理android中的数字格式异常

azure - 我可以使用 Azure Oauth 应用程序的 client_id 和 client_secret 获取用户配置文件吗?

c - 单字符用户输入和 fgets

c# - 将依赖项注入(inject) DelegatingHandler

c# - 使用 IOC 容器作为 MVC5 的依赖解析器会引发 ' cannot create an instance of an interface ' 错误

dependency-injection - Ninject 会自动注入(inject)非绑定(bind)类吗?

c# - 在某些条件下禁用 mvc3 客户端验证

c# - 如何在 Orchard CMS 数据库中保存自定义数据

c# - MVC3 下拉列表为

javascript - 如何保护从站点窃取的经度/纬度值