未生成MVC不显眼的验证数据-val- *标记属性

时间:2015-05-20 15:27:25

标签: c# asp.net-mvc razor unobtrusive-validation

编辑:好像没有任何属性可以运行,验证与否。例如,[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:修正了它,请参阅答案。

原帖:

此时我正在拔头发,因为我已经阅读了多篇有关此内容的文章,但没有一篇有帮助。奇怪的是,验证工作之前然后它突然停止工作(我没有改变任何东西)。我甚至重新启动了我的电脑,但这并没有真正帮助。

  • 是的,在web.config中将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled都设置为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和其他帮助程序类无法判断字段是否具有属性!

1 个答案:

答案 0 :(得分:0)

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

我仍然不知道为什么Autofac或Ninject会如何弄清楚属性和验证是如何工作的,没有我明确告诉他们这样做,但此时我甚至不在乎。

希望这有助于某人!