繁体   English   中英

可靠的验证在MVC4中不断突破

[英]Unobtrusive Validation Keeps breaking in MVC4

我遇到了一个令人毛骨悚然的问题,这使我非常疯狂。

运行良好后,首先出现以下错误:

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属性。

我什至进入我的LoginViewModel,从UserName中删除了[Required]。 错误移至EditFor(m => m.Password)。 我也从密码中删除了Required,并且该错误移动了RememberMe行,但该成员上根本没有Required属性。 实际上,在任何其他班级中,我什至没有别的名字叫RememberMe。

好的,我放弃了,开始从头开始重建webSite项目(不是解决方案的其余部分),但最终还是遇到了同样的事情。

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

一旦我到达要再次构建MVC4项目的地步,便分阶段进行了测试,以查看是否可以了解正在发生的事情。 一切都很好,正在加载,我可以登录等,直到我开始添加Areas。 刚开始,我只是将Areas文件夹直接复制到项目中(所有名称空间名称都相同,所以应该没问题)。 但可以肯定的是,我开始正确地获得此错误。

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

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

好,回到画板。 这次从解决方案外部重新创建了MVC4项目,此时仅拉入了对我的解决方案至关重要的2个关键NuGet软件包:Ninject.MVC3和Mvc3ControlsKit(来自nuget的一个用于3和4)。 好的,一切终于开始顺利了。 至此,我的Jquery版本为1.7.2,带有MVC4随附的默认Jquery UI。

在某个时候,我遇到了无法关闭jquery对话框的问题,因此我从NuGet安装了JQuery 1.8.2和最新的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;
    }

解决方案(如果正在使用Ninject)将取消绑定。

kernel.Unbind <ModelValidatorProvider>();

发生此错误是因为您试图在项目中使用混合验证解决方案,并且两个提供程序试图为字段添加不干扰的必需验证,因此引发了重复的问题。

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

对于这个问题,这不一定是每个人都满意的答案,但是我通过切换到我的DI的Unity解决了我的问题。 我确定是的,这是因为正如Mark所说,这可能是由于混合验证所致。 我在代码中使用DataAnnotation; 可能是Ninject在内部使用Fluent Validation,但我还不足以肯定地说,并且由于我已经找到了对自己满意的答案,因此没有足够的精力继续进行此追求。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM