Jav*_*vid 54 jquery jquery-validate unobtrusive-validation asp.net-mvc-4
任何人都可以告诉我为什么客户端验证不适用于我的MVC 4应用程序.
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)
在我的web.config中,我有:
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
在我的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>
}
Run Code Online (Sandbox Code Playgroud)
在登录页面的底部:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)
我的浏览器启用了JavaScript.在Visual Studio的MVC 4模板项目中,客户端验证工作正常.
运行应用程序,在查看页面源时在登录页面上,我看到这呈现:
<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>
Run Code Online (Sandbox Code Playgroud)
在这个底部:
<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>
Run Code Online (Sandbox Code Playgroud)
我的模型属性已注释:
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; }
}
Run Code Online (Sandbox Code Playgroud)
MyRequired
是从常规RequiredAttribute派生的类.原因是我的错误消息是通过覆盖类的FormatErrorMessage(string name)
方法来本地化的RequiredAttribute
.它工作正常 - 我的标签和错误消息已本地化.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的登录操作方法的POST版本中放了一个断点,它正在被击中.表单将发布到服务器端验证发生的服务器.客户端验证不会发生.
我错过了什么?
谢谢.
Liv*_* M. 46
我有同样的问题.似乎没有加载不显眼的验证脚本(参见最后的截图).我通过在_Layout.cshtml的末尾添加来修复它
@Scripts.Render("~/bundles/jqueryval")
Run Code Online (Sandbox Code Playgroud)
最终结果:
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)
除了我非常标准的CRUD视图外,一切都是Visual Studio项目模板的默认设置.
修复问题后加载的脚本:
小智 16
请确保在要使验证处于活动状态的每个视图的末尾添加此命令.
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)
san*_*zzz 10
在Global.asax.cs中,Application_Start()方法添加:
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MyRequiredAttribute), typeof(RequiredAttributeAdapter));
Run Code Online (Sandbox Code Playgroud)
您可能已经解决了这个问题,但我通过使用App_Start更改BundleConfig中的jqueryval项的顺序获得了一些运气.客户端验证即使在新的开箱即用的MVC 4互联网解决方案上也无法运行.所以我更改了默认值:
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.unobtrusive*",
"~/Scripts/jquery.validate*"));
Run Code Online (Sandbox Code Playgroud)
至
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*",
"~/Scripts/jquery.unobtrusive*"));
Run Code Online (Sandbox Code Playgroud)
现在我的客户端验证工作正常.你只是想确保不显眼的文件在最后(所以它不是侵入性的,哈哈:)
我终于通过在我的.cshtml文件中直接包含必要的脚本来解决这个问题,顺序如下:
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
Run Code Online (Sandbox Code Playgroud)
这有点偏离主题,但我不断惊讶于这种事情在Web编程中发生的频率,即一切似乎都已到位,但一些模糊的调整结果证明是必要的.脆弱,脆弱,脆弱.
您的输入中没有数据验证属性.确保使用服务器端帮助程序(如Html.TextBoxFor)生成它并且它位于表单内:
@using (Html.BeginForm())
{
...
@Html.TextBoxFor(x => x.AgreementNumber)
}
Run Code Online (Sandbox Code Playgroud)
另外我不知道jquery.validate.inline.js
脚本是什么,但如果它以某种方式取决于jquery.validate.js
插件,请确保它在它之后被引用.
在所有情况下,请在浏览器中查看您的javascript控制台是否存在潜在错误或缺少脚本.
小智 7
如果您在客户端使用jquery.validate.js
和 jquery.validate.unobtrusive.js
进行验证,则应记住您必须在请求中注册任何DOM元素的任何验证属性.因此,您可以使用此代码:
$.validator.unobtrusive.parse('your main element on layout');
Run Code Online (Sandbox Code Playgroud)
注册所有验证属性.您可以在(例如)上调用此方法:
$(document).ajaxSuccess() or $(document).ready()
注册所有这些方法,您的验证可以成功发生,而不是在cshtml文件上注册所有js文件.
对我来说这是大量的搜索。最终我决定使用 NuGet 而不是自己下载文件。我删除了所有涉及的脚本和脚本包,并获得了以下包(目前最新版本)
然后我将这些捆绑包添加到 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"));
Run Code Online (Sandbox Code Playgroud)
我将此引用添加到 _Layout.cshtml:
@Scripts.Render("~/bundles/jquery")
Run Code Online (Sandbox Code Playgroud)
我将此引用添加到我需要验证的任何视图中:
@Scripts.Render("~/bundles/jqueryval")
Run Code Online (Sandbox Code Playgroud)
现在一切正常了。
不要忘记这些事情(很多人都忘记了):