Asp.net mvc 4 不引人注目的验证不适用于动态内容
我在尝试使用通过AJAX调用动态加载的部分视图进行不引人注目的jquery验证时遇到了问题 我花了好几天的时间试图让这段代码在没有运气的情况下工作 以下是观点:Asp.net mvc 4 不引人注目的验证不适用于动态内容,asp.net-mvc-4,unobtrusive-validation,Asp.net Mvc 4,Unobtrusive Validation,我在尝试使用通过AJAX调用动态加载的部分视图进行不引人注目的jquery验证时遇到了问题 我花了好几天的时间试图让这段代码在没有运气的情况下工作 以下是观点: @model MvcApplication2.Models.test @using (Html.BeginForm()) { @Html.ValidationSummary(true); <div id="res"></div> <input id="submit" type="submit" va
@model MvcApplication2.Models.test
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<div id="res"></div>
<input id="submit" type="submit" value="submit" />
}
控制员:
public ActionResult GetView()
{
return PartialView("Test");
}
最后,javascript:
$(doument).ready(function () {
$.ajax({
url: '/test/getview',
success: function (res) {
$("#res").html(res);
$.validator.unobtrusive.parse($("#res"));
}
});
$("#submit").click(function () {
if ($("form").valid()) {
alert('valid');
return true;
} else {
alert('not valid');
return false;
}
});
验证不起作用。即使我没有在文本框中填写任何信息,提交事件也会显示警报(“有效”)
但是,如果不是动态加载视图,而是使用@Html.Partial(“test”,Model)
在主视图中呈现部分视图(我不做AJAX调用),那么验证工作就很好了
这可能是因为如果动态加载内容,DOM中还不存在控件。但是我调用了$.validator.unobtrusive.parse($(“#res”)代码>这应该足以让验证器了解新加载的控件
有人能帮忙吗 如果您试图解析已解析的表单,它将不会更新
将动态元素添加到表单时可以执行以下操作:
您可以删除表单的验证并按如下方式重新验证:
var form=$(formSelector)
.removeData(“validator”)/*由原始jquery.validate插件添加*/
.removeData(“不引人注目的验证”);/*由jquery unobtrusive插件添加*/
$.validator.unobtrusive.parse(表单);
使用jquerydata
方法访问表单的unobtrusiveValidation
数据:
$(表单).data('unobtrusiveValidation')
然后访问规则集合并添加新元素属性(这有点复杂)
您还可以在上查看这篇文章,以获取用于向表单添加动态元素的插件。此插件使用第二种解决方案。作为Nadeem Khedr答案的补充
如果已将表单动态加载到DOM中,然后调用
jQuery.validator.unobtrusive.parse(form);
(提到了额外的位),然后将使用ajax提交表单,记住调用
$(form).valid()
在提交表单之前,返回true或false(并运行实际验证)。测试:
if ($.validator.unobtrusive != undefined) {
$.validator.unobtrusive.parse("form");
}
将此添加到_Layout.cshtml
$(function () {
//parsing the unobtrusive attributes when we get content via ajax
$(document).ajaxComplete(function () {
$.validator.unobtrusive.parse(document);
});
});
令人惊讶的是,当我查看这个问题时,官方ASP.NET文档仍然没有任何关于不引人注目的parse()
方法的信息,也没有关于如何将其用于动态内容的信息。我在docs repo(参考@Nadeem的原始答案)上创建了一个请求,并提交了一个请求来修复它。这些信息现在可以在模型验证主题的一节中看到。我遇到了相同的问题,除此之外没有任何效果:
$(document).ready(function () {
rebindvalidators();
});
function rebindvalidators() {
var $form = $("#id-of-form");
$form.unbind();
$form.data("validator", null);
$.validator.unobtrusive.parse($form);
$form.validate($form.data("unobtrusiveValidation").options);
}
加
// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
return;
您试图保存表单的位置
我通过Ajax调用保存表单
希望这能对某人有所帮助。只需在模式代码末尾再次复制此代码即可
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
)() 嗨,我也面临同样的问题。我在弹出窗口(jquery对话框)中显示我的动态视图。非结构化验证不起作用。在我的动态视图中,我在哪里调用$(form).valid(),或者在其他地方调用$(form).submit?我总是通过在$(form).submit中返回false来阻止表单提交,因为我正在执行AJAX提交,但是我需要一种在验证失败时不调用AJAX提交的方法$(form).valid()就是答案!非常感谢。老兄,你太棒了,完全救了我一天!真棒的回答!我害怕自己会邀请它。来自那个页面的脚本就像一个符咒。代码,效果很好-快速更新(如果我可以的话)1。我正在使用knockout并获得字段的名称,这看起来是个问题。validator.unobtrusive.parseDynamicContent('form');(以获取所有字段),在提交时结束。2.这很好地为您提供了一种命名字段的方法(这似乎是必需的?我在其他2个字段的顶部使用jquery非强制引导,因此我的情况可能不同)。请注意,您应用于$(“表单”).data(“validator”).settings
的任何表单特定设置都将被$(formSelector)删除。removeData(“validator”)
,并在重新分析表单时替换为$.validator.defaults
中的默认值。这是包含动态字段的好方法,但确保在每次新解析时重复任何自定义初始化代码。使用解决方案1)会导致表单和表单元素具有重复的事件侦听器(如onKeypUp)如果您尝试重置它并多次解析它(比如在我的例子中,它是通过JS添加/删除的动态内容)。有没有解除所有事件绑定并避免重复的提示?在jquery.validate 1.10上,较新版本有一种销毁方法,这种方法效率特别低。我也有同样的问题,但在mvc 2中。我一步一步地介绍:这可能对您也有帮助。希望此帮助:)注意,不引人注目。parse
函数将选择器作为参数,不是元素。这一个对我有用。我从过去的许多天中找到了一个解决方案,它在asp.net core 2中有效。谢谢。
// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
return;
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>