MVC Unobtrusive validation data-val-* markup attributes not being generated
MVC Unobtrusive validation data-val-* markup attributes not being generated
编辑: 似乎没有任何属性起作用,验证与否。例如,[DataType(DataType.Date)] 无论如何也不会更改标记,虽然它应该向元素添加 'type=date',[Authorize] 属性甚至允许未经授权的用户通过等。任何人都有关于可能是什么问题的任何想法?
编辑 2: 在试图找出问题所在时添加了以下内容:
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(m => m.Name, Html.ViewData);
var val = metadata.GetValidators(new ControllerContext());
var attributes = metadata.ContainerType.GetProperties().Where(x => x.Name == "Name").FirstOrDefault().CustomAttributes;
'val' 变量没有 return 任何验证器,而在新项目中,同一行工作正常并且 return 是模型所有属性的 IEnumerable 属性 有。但是,'attributes' 变量确实找到了 属性 具有的所有属性。那么我该从哪里去找出问题所在呢?
编辑 3: 所以我比较了 属性 'ModelValidatorProviders.Providers' return 在 Global.asax 的 'Application_Start()' 方法在我的项目和一个新项目之间,结果由于某种原因我的项目没有 'DataAnnotationsModelValidatorProvider'。所以我在 'Application_Start()':
做了这个
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
现在验证有效(除了[Authorize]属性和其他与模型无关的属性,看起来它们仍然无效)!不过,这不是什么好办法。为什么首先不是 ModelValidatorProviders 属性 中的提供者?这可能与我安装了 Autofac 并且可能以某种方式混淆了它这一事实有关吗?
编辑 4: 已修复,请参阅答案。
原post:
此时我很紧张,因为我已经阅读了多篇关于此的文章并且 none 其中有帮助。奇怪的是,验证之前有效,然后突然停止工作(我没有改变任何东西)。我什至重新启动了我的电脑,但这并没有真正帮助。
- 是的,ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 在 web.config
中都设置为 true
- 所需的验证 JavaScript 文件也工作正常 - 它们被正确导入并加载正常,但问题甚至没有达到这些,因为服务器端甚至没有生成所需的 HTML 标记。
我的 ViewModel 看起来像这样(验证在网站上的任何地方都不起作用,所以我可以给你几乎任何视图模型):
public class ChangePasswordViewModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
这是视图(几乎也是默认的 MVC 视图,因此没有任何问题):
@model AwenterWeb.Models.ChangePasswordViewModel
@{
ViewBag.Title = "Change Password";
}
<h2>@ViewBag.Title.</h2>
@using (Html.BeginForm("ChangePassword", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Change Password Form</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.OldPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.NewPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Change password" class="btn btn-default" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
我在 Html.TextBoxFor 上放置了一个断点,并确保它 return 的 HTML 确实没有必要的验证属性。
还有什么可以打破的?这绝对不是 Validation JS 文件的问题,而是 Html.TextBoxFor 和其他助手 类 出于某种原因无法判断这些字段具有属性!
经过一整天的尝试找出可能的问题后,我决定完全卸载 Autofac 的任何痕迹,Ninject 我有(不知道为什么我有 Ninject,不记得曾经安装过它)并且令人惊讶,令人惊讶的是事情又开始工作了。然后我重新安装了我拥有的最新版本的 Autofac 软件包,并且属性仍然有效,所以这可能与那些流氓 Ninject 软件包有关。
我仍然不知道为什么 Autofac 或 Ninject 会在没有我明确告诉他们这样做的情况下扰乱属性和验证的工作方式,但在这一点上我什至不在乎。
希望这对某人有所帮助!
编辑: 似乎没有任何属性起作用,验证与否。例如,[DataType(DataType.Date)] 无论如何也不会更改标记,虽然它应该向元素添加 'type=date',[Authorize] 属性甚至允许未经授权的用户通过等。任何人都有关于可能是什么问题的任何想法?
编辑 2: 在试图找出问题所在时添加了以下内容:
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(m => m.Name, Html.ViewData);
var val = metadata.GetValidators(new ControllerContext());
var attributes = metadata.ContainerType.GetProperties().Where(x => x.Name == "Name").FirstOrDefault().CustomAttributes;
'val' 变量没有 return 任何验证器,而在新项目中,同一行工作正常并且 return 是模型所有属性的 IEnumerable 属性 有。但是,'attributes' 变量确实找到了 属性 具有的所有属性。那么我该从哪里去找出问题所在呢?
编辑 3: 所以我比较了 属性 'ModelValidatorProviders.Providers' return 在 Global.asax 的 'Application_Start()' 方法在我的项目和一个新项目之间,结果由于某种原因我的项目没有 'DataAnnotationsModelValidatorProvider'。所以我在 'Application_Start()':
做了这个ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
现在验证有效(除了[Authorize]属性和其他与模型无关的属性,看起来它们仍然无效)!不过,这不是什么好办法。为什么首先不是 ModelValidatorProviders 属性 中的提供者?这可能与我安装了 Autofac 并且可能以某种方式混淆了它这一事实有关吗?
编辑 4: 已修复,请参阅答案。
原post:
此时我很紧张,因为我已经阅读了多篇关于此的文章并且 none 其中有帮助。奇怪的是,验证之前有效,然后突然停止工作(我没有改变任何东西)。我什至重新启动了我的电脑,但这并没有真正帮助。
- 是的,ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 在 web.config 中都设置为 true
- 所需的验证 JavaScript 文件也工作正常 - 它们被正确导入并加载正常,但问题甚至没有达到这些,因为服务器端甚至没有生成所需的 HTML 标记。
我的 ViewModel 看起来像这样(验证在网站上的任何地方都不起作用,所以我可以给你几乎任何视图模型):
public class ChangePasswordViewModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
这是视图(几乎也是默认的 MVC 视图,因此没有任何问题):
@model AwenterWeb.Models.ChangePasswordViewModel
@{
ViewBag.Title = "Change Password";
}
<h2>@ViewBag.Title.</h2>
@using (Html.BeginForm("ChangePassword", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Change Password Form</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.OldPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.NewPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Change password" class="btn btn-default" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
我在 Html.TextBoxFor 上放置了一个断点,并确保它 return 的 HTML 确实没有必要的验证属性。 还有什么可以打破的?这绝对不是 Validation JS 文件的问题,而是 Html.TextBoxFor 和其他助手 类 出于某种原因无法判断这些字段具有属性!
经过一整天的尝试找出可能的问题后,我决定完全卸载 Autofac 的任何痕迹,Ninject 我有(不知道为什么我有 Ninject,不记得曾经安装过它)并且令人惊讶,令人惊讶的是事情又开始工作了。然后我重新安装了我拥有的最新版本的 Autofac 软件包,并且属性仍然有效,所以这可能与那些流氓 Ninject 软件包有关。
我仍然不知道为什么 Autofac 或 Ninject 会在没有我明确告诉他们这样做的情况下扰乱属性和验证的工作方式,但在这一点上我什至不在乎。
希望这对某人有所帮助!