编辑:好像没有任何属性可以运行,验证与否。例如,[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:所以我比较了我的项目和新项目之间Global.asax的'Application_Start()'方法中属性'ModelValidatorProviders.Providers'返回的内容,结果发现由于某种原因对于我的项目,它没有'DataAnnotationsModelValidatorProvider'。所以我在'Application_Start()'做了这个:
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
现在验证工作([Authorize]属性除外,其他与模型无关,看起来它们仍然无效)!但是,没有太大的解决方法。为什么ModelValidatorProviders属性中的提供程序不是首先?它与我安装了Autofac的事实有什么关系吗?或许它会以某种方式混淆它?
编辑4:修正了它,请参阅答案。
原帖:
此时我正在拔头发,因为我已经阅读了多篇有关此内容的文章,但没有一篇有帮助。奇怪的是,验证工作之前然后它突然停止工作(我没有改变任何东西)。我甚至重新启动了我的电脑,但这并没有真正帮助。
我的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和其他帮助程序类无法判断字段是否具有属性!
答案 0 :(得分:0)
经过一整天试图找出可能出错的地方后,我决定完全卸载我所拥有的Autofac和Ninject的任何痕迹(不知道为什么我有Ninject,不记得曾经安装过令人惊讶的是,惊喜的东西又重新开始了。然后我重新安装了我的Autofac软件包的最新版本,属性仍然有效,所以也许它与那些流氓Ninject软件包有关。
我仍然不知道为什么Autofac或Ninject会如何弄清楚属性和验证是如何工作的,没有我明确告诉他们这样做,但此时我甚至不在乎。
希望这有助于某人!