在 ASP.NET MVC 5 中出现以下错误:不显眼的客户端验证规则中的验证类型名称必须是唯一的。所需
Getting the following error in ASP.NET MVC 5: Validation type names in unobtrusive client validation rules must be unique. The [...] required
我正在使用 ASP.NET MVC 5 并尝试使用 [Required]
属性来启用客户端验证。
我收到以下错误:
Validation type names in unobtrusive client validation rules must be unique. The following validation type was seen more than once: required
我已经在这里搜索过这个错误,但我尝试过的任何方法都没有真正帮助。
Index.cshtml 浏览量:
@{
ViewBag.Title = "Login";
}
@model CapitalWorkflowWebApplication.Models.LoginModel
<h2>Login</h2>
@using (Html.BeginForm("login-user", "Login", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="container">
<div class="row">
Login
</div>
<div class="row">
@Html.LabelFor(model => model.Username)
@Html.TextBoxFor(model => model.Username)
@Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
</div>
<div class="row">
@Html.LabelFor(model => model.Password)
@Html.TextBoxFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
<div class="row">
<input type="submit" value="Login" />
</div>
</div>
}
登录模型:
using System.ComponentModel.DataAnnotations;
namespace CapitalWorkflowWebApplication.Models
{
public class LoginModel
{
[Required(ErrorMessage = "Le champ utilisateur est obligatoire")]
[Display(Name = "Utilisateur")]
public string Username { get; set; }
[Required(ErrorMessage = "Le champ mot de passe est obligatoire")]
[Display(Name = "Mot De Passe")]
[DataType(DataType.Password)]
public string Password { get; set; }
public string ErrorMessage { get; set; }
}
}
根据此处的一些 comments/questions/answers,我尝试在我的控制器中设置一个断点,并立即 window 我 运行 this: ModelValidatorProviders.Providers
和结果是:
[0]: {System.Web.Mvc.DataAnnotationsModelValidatorProvider}
[1]: {System.Web.Mvc.DataErrorInfoModelValidatorProvider}
[2]: {System.Web.Mvc.ClientDataTypeModelValidatorProvider}
我没有使用任何自定义验证器。
在我的 web.config
中,我有这些设置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
在我的布局中我有:
<script src="@Url.Content("~/Scripts/jquery-3.3.1.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
到目前为止我尝试了什么:
- 我从
LoginModel
中删除了 [Required] 属性,这消除了错误,但也删除了客户端验证,这不是想要的结果。
- 我在我的应用程序启动代码中添加了
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
,但错误始终存在。
- 我尝试将 web.config 中的
ClientValidationEnabled
键设置为 false,但将 UnobtrusiveJavaScriptEnabled
保持为 true。它删除了错误,但没有删除客户端验证,呃。
- 我还尝试将
UnobtrusiveJavaScriptEnabled
键设置为 false,并保持 ClientValidationEnabled
为 true。它还消除了错误,但我没有看到任何客户端验证。它总是 post 返回控制器。
注意 1:在 @Html.TextBoxFor(model=>model.Username);
行的视图中调试时出现错误
注意 2:我使用 Ninject 作为依赖解析器,如果需要,我会 post 我的 ninject 配置 class,因为我已经看到一些评论说可能是 DI 容器导致了这个问题。
我面临的问题可能是什么,如何解决?
经过更多的挖掘和专门搜索与 Ninject 相关的问题,结果发现 Ninject 实际上是问题的根源。
为了修复这个错误,我在创建内核时添加了这个:
kernel.Unbind<ModelValidatorProvider>();
添加这个之后,错误消失了,客户端验证按预期工作。
我正在使用 ASP.NET MVC 5 并尝试使用 [Required]
属性来启用客户端验证。
我收到以下错误:
Validation type names in unobtrusive client validation rules must be unique. The following validation type was seen more than once: required
我已经在这里搜索过这个错误,但我尝试过的任何方法都没有真正帮助。
Index.cshtml 浏览量:
@{
ViewBag.Title = "Login";
}
@model CapitalWorkflowWebApplication.Models.LoginModel
<h2>Login</h2>
@using (Html.BeginForm("login-user", "Login", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="container">
<div class="row">
Login
</div>
<div class="row">
@Html.LabelFor(model => model.Username)
@Html.TextBoxFor(model => model.Username)
@Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
</div>
<div class="row">
@Html.LabelFor(model => model.Password)
@Html.TextBoxFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
<div class="row">
<input type="submit" value="Login" />
</div>
</div>
}
登录模型:
using System.ComponentModel.DataAnnotations;
namespace CapitalWorkflowWebApplication.Models
{
public class LoginModel
{
[Required(ErrorMessage = "Le champ utilisateur est obligatoire")]
[Display(Name = "Utilisateur")]
public string Username { get; set; }
[Required(ErrorMessage = "Le champ mot de passe est obligatoire")]
[Display(Name = "Mot De Passe")]
[DataType(DataType.Password)]
public string Password { get; set; }
public string ErrorMessage { get; set; }
}
}
根据此处的一些 comments/questions/answers,我尝试在我的控制器中设置一个断点,并立即 window 我 运行 this: ModelValidatorProviders.Providers
和结果是:
[0]: {System.Web.Mvc.DataAnnotationsModelValidatorProvider}
[1]: {System.Web.Mvc.DataErrorInfoModelValidatorProvider}
[2]: {System.Web.Mvc.ClientDataTypeModelValidatorProvider}
我没有使用任何自定义验证器。
在我的 web.config
中,我有这些设置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
在我的布局中我有:
<script src="@Url.Content("~/Scripts/jquery-3.3.1.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
到目前为止我尝试了什么:
- 我从
LoginModel
中删除了 [Required] 属性,这消除了错误,但也删除了客户端验证,这不是想要的结果。 - 我在我的应用程序启动代码中添加了
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
,但错误始终存在。 - 我尝试将 web.config 中的
ClientValidationEnabled
键设置为 false,但将UnobtrusiveJavaScriptEnabled
保持为 true。它删除了错误,但没有删除客户端验证,呃。 - 我还尝试将
UnobtrusiveJavaScriptEnabled
键设置为 false,并保持ClientValidationEnabled
为 true。它还消除了错误,但我没有看到任何客户端验证。它总是 post 返回控制器。
注意 1:在 @Html.TextBoxFor(model=>model.Username);
注意 2:我使用 Ninject 作为依赖解析器,如果需要,我会 post 我的 ninject 配置 class,因为我已经看到一些评论说可能是 DI 容器导致了这个问题。
我面临的问题可能是什么,如何解决?
经过更多的挖掘和专门搜索与 Ninject 相关的问题,结果发现 Ninject 实际上是问题的根源。
为了修复这个错误,我在创建内核时添加了这个:
kernel.Unbind<ModelValidatorProvider>();
添加这个之后,错误消失了,客户端验证按预期工作。