没有生成不显眼的验证data-val-*标记属性
本文关键字:data-val- 属性 验证 不显眼 | 更新日期: 2023-09-27 17:50:17
Edit:似乎没有任何属性工作,验证与否。例如,[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'变量不返回任何验证器,而在新项目中,同一行正常工作并返回一个包含model属性所有属性的IEnumerable。不过,'attributes'变量会找到该属性拥有的所有属性。那我该从哪里找出问题所在呢?
编辑3:所以我比较了属性'ModelValidatorProviders。提供商在Global中的回报。asax的'Application_Start()'方法在我的项目和一个新项目之间,事实证明,出于某种原因,我的项目它没有'DataAnnotationsModelValidatorProvider'。所以我在'Application_Start()':
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
现在验证工作(除了[Authorize]属性和其他与模型无关的属性,看起来它们仍然不起作用)!不过,这并不是什么大问题,不是吗?为什么提供者不在ModelValidatorProviders属性中呢?会不会是因为我安装了Autofac,而这可能会影响到它呢?
编辑4:修复,见答案
原始文章:
在这一点上,我把我的头发拔出来了,因为我读了很多关于这个的文章,但没有一篇有帮助。奇怪的是,之前的验证工作,然后突然停止工作(我没有改变任何东西)。我甚至重新启动了我的电脑,但这并没有真正起作用。- 是的,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并确保它返回的HTML确实没有必要的验证属性。还有什么会被打破?这绝对不是验证JS文件的问题,而是Html的问题。TextBoxFor和其他helper类由于某种原因无法判断字段上有属性!
经过一整天的尝试找出什么可能是错误的,我决定完全卸载Autofac和Ninject的任何痕迹我有(不知道为什么我有Ninject,不记得曾经安装过)和惊喜,惊喜的东西又开始工作了。然后我重新安装了最新版本的Autofac软件包,属性仍然可以工作,所以也许这与那些流氓Ninject软件包有关。
我仍然不知道为什么Autofac或Ninject会弄乱属性和验证的工作方式,没有我明确地告诉他们这样做,但在这一点上,我甚至不在乎。
希望这能帮助到一些人!