我一直有一个奇怪的问题让我发疯。
在它运行良好之后,它突然出现以下错误:
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;
}