Jquery MVC4中不引人注目的验证不断中断

Jquery MVC4中不引人注目的验证不断中断,jquery,asp.net-mvc,asp.net-mvc-4,unobtrusive-validation,Jquery,Asp.net Mvc,Asp.net Mvc 4,Unobtrusive Validation,我一直有一个非常棘手的问题,这让我简直疯了 在工作正常后,它突然出现了以下错误: Validation type names in unobtrusive client validation rules must be unique. The following validation type was seen more than once: required 此错误首先从Area/Admin/WebSites中的一个控制器开始。但是,我的身份验证cookie一到期,我就在登录页面的

我一直有一个非常棘手的问题,这让我简直疯了

在工作正常后,它突然出现了以下错误:

Validation type names in unobtrusive client validation rules must be unique. The following     
validation type was seen more than once: required
此错误首先从Area/Admin/WebSites中的一个控制器开始。但是,我的身份验证cookie一到期,我就在登录页面的EditFor(m=>m.UserName)行上找到了它。我仔细阅读了我的代码,在任何模型的任何地方寻找重复的Required属性,这些属性可能被远程命名为相同的,但毫无用处

我甚至进入了我的LoginView模型,从用户名中删除了[Required]。错误移动到EditFor(m=>m.Password)。我也从密码中删除了Required,错误移动了RememberMe行,但该成员上根本没有Required属性。事实上,在任何其他类中,我都没有别的名字,甚至连一个叫做RememberMe的名字都没有

好吧,我放弃了,开始从头开始重建网站项目(而不是解决方案的其余部分),结果还是一样

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

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

好的,我开始按与最初创建控制器相反的顺序删除控制器。直到我完全删除了Areas文件夹,网站才恢复正常

通过测试,一旦我在项目中创建了一个Areas文件夹,它就会崩溃。如果我使用GUI创建新区域,也是一样的

好的,回到绘图板上来。从头开始重新创建MVC4项目,这一次是在解决方案之外,此时只引入了对我的解决方案至关重要的两个关键NuGet包:Ninject.MVC3和Mvc3ControlsKit(来自NuGet的一个,用于3和4)。好了,一切终于开始顺利了。此时,我的Jquery是1.7.2版,带有MVC4附带的默认Jquery UI

在某个时候,我遇到了jquery对话框无法关闭的问题,因此我安装了jQuery1.8.2和NuGet的最新jQueryUI。一切正常,直到我去添加一个完全空白的控制器在我的管理区,这个错误再次弹出

好的,再回到绘图板上。。。我分阶段重建它,在每个点进行测试。这次没有安装最新的JQuery goodies。一切又恢复正常了。添加了一个新控制器,然后添加了两个。好的,把这个版本复制一份,放在一边。将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; }

}
此时,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;
    }
受保护的重写IEnumerable GetValidator(ModelMetadata元数据、ControllerContext上下文、IEnumerable属性)
{
var validators=base.GetValidators(元数据、上下文、属性);
foreach(validators.OfType()中的var modelValidator)
{
var attribute=this.getAttributeMethodInfo.Invoke(modelValidator,新对象[0]);
this.kernel.Inject(属性);
}
返回验证器;
}

发生错误的原因是,您试图在项目中使用混合验证解决方案,而两个提供商试图为字段添加不引人注目的必需验证,因此会引发重复问题


请确保您没有同时使用dataannotation和fluent validation对同一属性执行相同的验证(如您的案例中所需)。

在这个问题上,这不一定是每个人都满意的答案,但我通过切换到Unity来解决我的问题。我已经确定,是的,这是因为,正如马克所说,这可能是由于混合验证。我在代码中使用DataAnnotation;可能是Ninject在内部使用了流畅的验证,但我知道的还不够确定,而且我也没有精力继续进行这项工作,因为我已经找到了一个令自己满意的答案

我喜欢Ninject,但就我而言,最新版本的Unity实际上也同样易于使用,因为我只需添加一个文件(bootstrapper.cs)并从启动事件调用bootstrapper.BuildUnityContainer()。因此,我现在将坚持使用这个解决方案。

解决方案(如果使用了Ninject)是解除绑定


Unbind()

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


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

如果多次包含脚本标记(例如在局部视图中),则可能会出现这种情况。您需要查看生成的最终HTML并找出问题所在,然后您可以将其追溯到yo
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;
    }
RuleFor(i => i.SomeValue).NotNull().NotEmpty();