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.js
和jquery.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> }
- DataSet不支持导出中的System.Nullable <>
- 在VS 2012中创buildMVC4项目的NuGet错误
- “System.Web.Mvc.MvcWebRazorHostFactory”types的expression式不能用于返回types“System.Web.WebPages.Razor.WebRazorHostFactory”
- MVC 4列表模型绑定如何工作?
- IISExpress与0xc0000008错误崩溃
- 如何在C#中获取用户的公共IP地址
- MVC4枚举和单选button列表
- MVC 4 Beta并排安装错误
- Razor MVC使用Model Array填充Javascript数组