没有生成不显眼的验证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类由于某种原因无法判断字段上有属性!

没有生成不显眼的验证data-val-*标记属性

经过一整天的尝试找出什么可能是错误的,我决定完全卸载Autofac和Ninject的任何痕迹我有(不知道为什么我有Ninject,不记得曾经安装过)和惊喜,惊喜的东西又开始工作了。然后我重新安装了最新版本的Autofac软件包,属性仍然可以工作,所以也许这与那些流氓Ninject软件包有关。

我仍然不知道为什么Autofac或Ninject会弄乱属性和验证的工作方式,没有我明确地告诉他们这样做,但在这一点上,我甚至不在乎。

希望这能帮助到一些人!