gpt4 book ai didi

c# - MVC Unobtrusive validation data-val-* markup attributes not being generated

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:45 25 4
gpt4 key购买 nike

编辑: 似乎没有任何属性起作用,验证与否。例如,[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”变量不返回任何验证器,而在新项目中,同一行可以正常工作并返回模型属性具有的所有属性的 IEnumerable。但是,'attributes' 变量确实找到了属性具有的所有属性。那么我该从哪里去找出问题所在呢?

编辑 3: 所以我比较了属性“ModelValidatorProviders.Providers”在我的项目和新项目之间在 Global.asax 的“Application_Start()”方法中返回的内容,事实证明出于某种原因对于我的项目,它没有“DataAnnotationsModelValidatorProvider”。所以我在“Application_Start()”做了这个:

ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());

现在验证有效(除了 [Authorize] 属性和其他与模型无关的属性,看起来它们仍然无效)!不过,这不是什么好办法。为什么首先不是 ModelValidatorProviders 属性中的提供者?这可能与我安装了 Autofac 并且可能以某种方式混淆了它这一事实有关吗?

编辑 4: 已修复,请参阅答案。

原帖:

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

  • 是的,ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 在 web.config 中都设置为 true
  • 所需的验证 JavaScript 文件也可以正常工作 - 它们可以正确导入并正常加载,但问题甚至还没有出现,因为服务器端甚至没有生成所需的 HTML 标记。

我的 ViewModel 看起来像这样(验证在站点的任何地方都不起作用,所以我可以为您提供几乎任何 View 模型):

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; }
}

这是 View (几乎也是默认的 MVC View ,因此没有任何问题):

@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 确实没有必要的验证属性。还有什么可以打破的?这绝对不是 Validation JS 文件的问题,而是 Html.TextBoxFor 和其他辅助类由于某种原因无法判断字段具有属性!

最佳答案

经过一整天的尝试找出可能出了什么问题后,我决定完全卸载我拥有的 Autofac 和 Ninject 的所有痕迹(不知道为什么我有 Ninject,不记得曾经安装过它)并感到惊讶,令人惊讶的事情又开始起作用了。然后我重新安装了我拥有的最新版本的 Autofac 软件包,并且属性仍然有效,所以这可能与那些流氓 Ninject 软件包有关。

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

希望这对某人有帮助!

关于c# - MVC Unobtrusive validation data-val-* markup attributes not being generated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30354057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com