MVC 4客户端validation不起作用

谁能告诉我为什么客户端validation不工作在我的MVC 4应用程序。

_layout.schtml

@Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) 

在我的web.config中有:

 <appSettings> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> 

在我的login.cshtml页面中有:

 @using (Html.BeginForm()) { <div class="formscontent"> <ol> <li> @Html.LabelFor(x => x.AgreementNumber) <br /> @Html.TextBoxFor(x => x.AgreementNumber, new { size = "30" }) <br /> @Html.ValidationMessageFor(m => m.AgreementNumber) <br /> <br /> </li> <li> @Html.LabelFor(x => x.UserName) <br /> @Html.TextBoxFor(x => x.UserName, new { size = "30" }) <br /> @Html.ValidationMessageFor(m => m.UserName) <br /> <br /> </li> <li> @Html.LabelFor(x => x.Password) <br /> @Html.PasswordFor(x => x.Password, new { size = "30" }) <br /> @Html.ValidationMessageFor(m => m.Password) <br /> <br /> </li> </ol> </div> <ol> <li> @Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" }) </li> </ol> <br /> <input class="mainbutton" type="submit" value="@Model.Localisation.TranslateHtmlString("LogonBtn")" /><br /> <div style="text-align: left; padding: 0 5px 5px 10px;"> Forgot login-info? clik <a class="link" href="@Url.Action("Index", "Credentials")">here.</a> </div> } 

在login页面的底部:

 @section Scripts { @Scripts.Render("~/bundles/jqueryval") } 

JavaScript已在我的浏览器中启用。 在Visual Studio客户端validation的MVC 4模板项目中工作正常。

运行应用程序,在login页面查看页面源时,我看到这个呈现:

 <label for="AgreementNumber">number</label> <br /> <input id="AgreementNumber" name="AgreementNumber" size="30" type="text" value="387893" /> <br /> <span class="field-validation-valid" data-valmsg-for="AgreementNumber" data-valmsg- replace="true"></span> 

在这个底部:

 <script src="/BMWebsite/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="/BMWebsite/Scripts/jquery.validate.inline.js"></script> <script src="/BMWebsite/Scripts/jquery.validate.js"></script> <script src="/BMWebsite/Scripts/jquery.validate.unobtrusive.js"></script> 

我的模型属性注释:

 public class LogonModel : ModelBase { [MyRequired("AgreementNumberRequiredProperty")] [MyDisplay("AgreementNumberLabel")] public string AgreementNumber { get; set; } [MyRequired("UserNameRequiredProperty")] [MyDisplay("UserNameLabel")] public string UserName { get; set; } [MyRequired("PasswordRequiredProperty")] [DataType(DataType.Password)] [MyDisplay("PasswordLabel")] public string Password { get; set; } [MyDisplay("RememberMeCheckBox")] public bool RememberMe { get; set; } } 

MyRequired是从常规RequiredAttribute派生的类。 原因是我的错误消息是通过重写RequiredAttribute类的FormatErrorMessage(string name)方法来本地化的。 它工作正常 – 我的标签和错误信息是本地化的。

MyRequired.cs

 public class MyRequiredAttribute : RequiredAttribute { private readonly string _errorMessagekey; public MyRequiredAttribute(string errorMessage) { _errorMessagekey = errorMessage; } public override string FormatErrorMessage(string name) { var translation = HttpContext.Current.Session["translation"] as LocalisationHelper; return translation != null ? translation.Translate(_errorMessagekey) : ErrorMessage; } } 

我在我的login操作方法的POST版本中放置了一个断点,并且正在被命中。 表单被发布到服务器端进行validation的服务器上。 客户端validation不会发生。

我错过了什么?

谢谢。

我有同样的问题。 看起来,不显眼的validation脚本没有加载(见最后的截图)。 我通过在_Layout.cshtml的末尾添加来修复它

  @Scripts.Render("~/bundles/jqueryval") 

最终的结果是:

  @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/jqueryval") @RenderSection("scripts", required: false) 

除了我漂亮的标准CRUD视图,一切都是Visual Studio项目模板的默认值。

修复问题后加载脚本: 在这里输入图像说明

一定要在每个视图的末尾添加此命令,以使validation处于活动状态。

 @section Scripts { @Scripts.Render("~/bundles/jqueryval") } 

input中没有数据validation属性。 确保你已经用一个服务器端帮助器(如Html.TextBoxFor)生成了它,并且它在一个表单中:

 @using (Html.BeginForm()) { ... @Html.TextBoxFor(x => x.AgreementNumber) } 

另外我不知道jquery.validate.inline.js脚本是什么,但是如果它以某种方式依赖于jquery.validate.js插件,请确保在它之后引用它。

在所有情况下,请在浏览器中查看您的JavaScript控制台,以了解可能的错误或缺less脚本。

你可能已经解决了这个问题,但是通过在App_Start中改变BundleConfig中的jqueryval项的顺序,我有一些运气。 即使在新的即开即用的MVC 4互联网解决scheme上,客户端validation也无法正常工作。 所以我改变了默认值:

  bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); 

  bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate*", "~/Scripts/jquery.unobtrusive*")); 

现在我的客户端validation正在工作。 你只是想确保不显眼的文件是最后(所以这不是侵入,哈哈:)

在Global.asax.cs中,Application_Start()方法添加:

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MyRequiredAttribute), typeof(RequiredAttributeAdapter)); 

我终于通过在我的.cshtml文件中直接包含必要的脚本来解决这个问题,顺序如下:

 <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="/Scripts/jquery.validate.js"></script> <script src="/Scripts/jquery.validate.unobtrusive.js"></script> 

这有点偏离主题,但我总是惊讶于在Web编程中发生这种事情的频率,即一切似乎都已经到位,但一些模糊的调整事实certificate是必要的事情。 虚弱,脆弱,脆弱

如果您使用jquery.validate.jsjquery.validate.unobtrusive.js在客户端进行validation,则应该记住您必须在请求中注册任何DOM元素的任何validation属性。 因此,您可以使用此代码:

 $.validator.unobtrusive.parse('your main element on layout'); 

注册所有validation属性。 您可以调用此方法(例如): $(document).ajaxSuccess() or $(document).ready()来注册所有这些方法,您的validation可以成功进行,而不是在cshtml文件中注册所有js文件。

validationdata- *属性没有显示在您input的呈现的html中的原因可能是没有表单上下文。 使用@using(Html.BeginForm(...)) { ... }创build表单时,FormContext会自动创build。

如果您为表单使用常规的HTML标记,您将无法获得客户端validation。

我有一个validation问题,表单post然后validation,

这不适用于jQuery的CDN

  <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

这工作没有jQuery的CDN

 <script src="~/Scripts/jquery-1.7.1.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

希望有助于某人。

在我的情况下,validation本身工作(我可以validation一个元素,并检索一个正确的布尔值),但没有视觉输出。

我的错是我忘了这行@ Html.ValidationMessageFor(m => …)

TS在他的代码中有这个,让我走上正轨,但我把它放在这里作为别人的参考。

下面一行显示你没有像AgreementNumber所要求的那样设置一个DataAttribute

 <input id="AgreementNumber" name="AgreementNumber" size="30" type="text" value="387893" /> 

你需要

 [Required] public String AgreementNumber{get;set;} 
 <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="/Scripts/jquery.validate.js"></script> <script src="/Scripts/jquery.validate.unobtrusive.js"></script> 

此代码为我工作。

对我来说,这是一个很大的search。 最终我决定使用NuGet,而不是自己下载文件。 我删除了所有涉及的脚本和脚本捆绑,并得到以下包(截至目前的最新版本)

  • jQuery(3.1.1)
  • jQueryvalidation(1.15.1)
  • 微软jQuery Ubobtrusive Ajax(3.2.3)
  • 微软jQuery Unobtrusivevalidation(3.2.3)

然后我将这些包添加到BundleConfig文件中:

 bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate.js", "~/Scripts/jquery.validate.unobtrusive.js", "~/Scripts/jquery.unobtrusive-ajax.js")); 

我添加了这个参考_Layout.cshtml:

 @Scripts.Render("~/bundles/jquery") 

我把这个参考添加到我需要validation的任何视图中:

 @Scripts.Render("~/bundles/jqueryval") 

现在一切正常。

不要忘记这些事情(很多人忘记了):

  • 表单标签(@using(Html.BeginForm()))
  • validation摘要(@ Html.ValidationSummary())
  • 您input的validation消息(例如:@ Html.ValidationMessageFor(model => model.StartDate))
  • configuration()
  • 添加到包中的文件的顺序(如上所述)

使用:

@ Html.EditorFor

代替:

@ Html.TextBoxFor

我创build了这个html <form action="/StudentInfo/Edit/2" method="post" novalidate="novalidate">其中novalidate="novalidate"阻止客户端jQuery执行,当我删除novalidate="novalidate" ,客户端的jQuery被启用和盯着工作。

我想添加到这篇文章,我正在体验相同的问题,但在部分视图。

我需要补充

 <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

对局部视图来说,即使已经存在于_Layout视图中。

参考文献:

  • 数据注释/validation不适用于部分视图
  @section Scripts { <script src="../Scripts/jquery.validate-vsdoc.js"></script> <script src="../Scripts/jquery.validate.js"></script> <script src="../Scripts/jquery.validate.min.js"></script> <script src="../Scripts/jquery.validate.unobtrusive.js"></script> <script src="../Scripts/jquery.validate.unobtrusive.min.js"></script> }