5

我一直有一个奇怪的问题让我发疯。

在它运行良好之后,它突然出现以下错误:

Validation type names in unobtrusive client validation rules must be unique. The following     
validation type was seen more than once: required

此错误首先在我在 Area/Admin/WebSites 中的一个控制器上开始。但是,一旦我的 auth cookie 过期,我就会在我的登录页面以及 EditFor(m=>m.UserName) 行上得到它。我梳理了我的代码,在任何可能远程命名相同的模型上的任何地方寻找重复的必需属性,但无济于事。

我什至进入了我的 LoginViewModel,从 UserName 中删除了 [Required]。错误移至 EditFor(m=>m.Password)。我也从 Password 中删除了Required,错误移动了RememberMe 行,但该成员甚至根本没有Required 属性。事实上,我在任何地方的任何其他课程中都没有其他任何东西,甚至远程命名为 RememberMe。

好吧,我放弃了,开始从头开始重建网站项目(不是解决方案的其余部分),但最终还是得到了同样的结果。

出于绝望,我从头开始重建整个解决方案,只复制 *.cs 文件并手动重新加载所有引用,认为某处存在重复引用。

一旦我到了再次构建 MVC4 项目的地步,我就分阶段进行,看看我是否能弄清楚发生了什么。它做得很好,加载并且我可以登录等,直到我开始添加区域。起初我只是将 Areas 文件夹直接复制到项目中(所有命名空间名称都相同,所以应该没问题)。但果然我开始以正确的方式得到这个错误。

好的,所以我开始以与最初创建控制器相反的顺序删除控制器。在我完全删除“区域”文件夹之前,该站点从未恢复正常。

对此进行测试,一旦我在项目中创建了一个区域文件夹,它就会中断。如果我使用 GUI 创建新区域,情况也是如此。

好的,回到绘图板。从头开始重新创建 MVC4 项目,这次是在解决方案之外,并且此时仅提取了对我的解决方案至关重要的 2 个关键 NuGet 包:Ninject.MVC3 和 Mvc3ControlsKit(来自 nuget 的用于 3 和 4 的包)。好吧,一切终于开始运作良好。此时,我的 Jquery 是 1.7.2 版本,带有 MVC4 附带的默认 Jquery UI。

在某些时候,我遇到了 jquery 对话框未关闭的问题,因此我安装了 JQuery 1.8.2 和来自 NuGet 的最新 JQuery UI。一切正常,直到我在我的管理区域中添加一个完全空白的控制器并且再次弹出此错误。

好的,再次回到绘图板......我分阶段重建它,在每个点进行测试。这次不安装最新的 JQuery 好东西。一切又开始正常工作。添加了一个新控制器,然后添加了两个。好的,制作此版本的有效副本并将其放在一边。将 Jquery 和 Jquery UI 更新到最新版本。在该区域添加一个新控制器,它仍然可以继续工作,令我非常沮丧。

我的实体都在使用 Fluent API 来配置我的实体,根本没有 DataAnnotatian 属性。有任何想法吗?我一直在等待它再次破裂。

编辑:

这是我刚刚发现的更多信息。我的登录部分视图中的这行代码发生了错误。我的模型是

public class LoginViewModel 
{
    [Required]
    [Display(Name = "User Name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }

    /// <summary>
    /// Role
    /// </summary>
    public string Role { get; set; }

}

在视图中调用此行时出现错误:

@Html.TextBoxFor(m => m.UserName)

此时,Ninject 接管并从 Ninject.Web.Mvc.Validation.NinjectDataAnnotationsModelValidatorProvider 类中的以下方法返回后立即发生上述不显眼的验证错误。此外,我已确认此方法已正确识别所需的验证并注入它们。此方法中没有发生异常,但之后发生了异常。

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        var validators = base.GetValidators(metadata, context, attributes);
        foreach (var modelValidator in validators.OfType<DataAnnotationsModelValidator>())
        {
            var attribute = this.getAttributeMethodInfo.Invoke(modelValidator, new object[0]);
            this.kernel.Inject(attribute);
        }

        return validators;
    }
4

4 回答 4

12

解决方案(如果正在使用 Ninject)是解除绑定。

kernel.Unbind<ModelValidatorProvider>();

于 2013-09-30T12:36:21.063 回答
5

发生该错误是因为您尝试在项目中使用混合验证解决方案,并且两个提供商正在尝试为字段添加不显眼的必需验证,因此会引发重复问题。

确保您没有同时使用数据注释和流利的验证来对相同的属性执行相同的验证(如您的情况所要求的)。

于 2012-10-09T12:41:58.993 回答
2

对于这个问题,这不一定是每个人都满意的答案,但我通过将我的 DI 切换到 Unity 解决了我的问题。我已经确定,是的,这是因为,正如马克所说,这可能是由于混合验证。我在我的代码中使用 DataAnnotation;可能是 Ninject 在内部使用 Fluent Validation,但我知道的不够多,无法确定,也没有精力继续这个追求,因为我找到了一个让自己满意的答案。

我喜欢 Ninject,但在我的情况下,最新版本的 Unity 实际上同样易于使用,因为我所要做的就是添加一个文件 (bootstrapper.cs) 并从启动事件中调用 BootStrapper.BuildUnityContainer()。所以,我现在会坚持这个解决方案。

于 2012-10-18T00:08:44.277 回答
1

我在使用流利验证的 MVC4 项目中遇到了同样的错误。我的错误是我使用了 .NotNull() 和 .NotEmpty( 对于同一个字段):

RuleFor(i => i.SomeValue).NotNull().NotEmpty();

删除最后一个 .NotEmpty() 解决了这个问题。

于 2014-10-07T07:50:14.213 回答