Asp.net mvc ASP.NET MVC3自定义不引人注目的客户端验证不阻止Ajax表单发布

Asp.net mvc ASP.NET MVC3自定义不引人注目的客户端验证不阻止Ajax表单发布,asp.net-mvc,validation,asp.net-mvc-3,unobtrusive-validation,Asp.net Mvc,Validation,Asp.net Mvc 3,Unobtrusive Validation,我有一个“更改密码”页面,需要在发送之前通过Javascript对页面上输入的任何密码进行散列。更复杂的是,页面通过jQuery load()调用加载,并通过jQuery.Form ajaxForm()调用提交。在MVC2中一切正常,但MVC3给我带来了麻烦 也就是说,我有一个带有“更改密码”链接的页面,单击该链接时,将更改密码页面加载到jQuery模式弹出窗口中,然后更改密码页面上的表单通过jQuery.form库提交(基本上只是包装一个$.ajax调用),并将其结果返回到模式相同的模式弹出窗

我有一个“更改密码”页面,需要在发送之前通过Javascript对页面上输入的任何密码进行散列。更复杂的是,页面通过jQuery load()调用加载,并通过jQuery.Form ajaxForm()调用提交。在MVC2中一切正常,但MVC3给我带来了麻烦

也就是说,我有一个带有“更改密码”链接的页面,单击该链接时,将更改密码页面加载到jQuery模式弹出窗口中,然后更改密码页面上的表单通过jQuery.form库提交(基本上只是包装一个$.ajax调用),并将其结果返回到模式相同的模式弹出窗口中

基本上,我有一个具有两个属性的模型,OldPassword和NewPassword。我有两个由视图生成的隐藏字段。它们保存另外两个字段的散列值,即PreHashHoldPassword和PrehashNewPassword,并通过keyup事件进行更新(我知道,这意味着它在每个keyup上都进行了一次完整的SHA256散列…效率低下,但得到了用于测试的任务doen)。这里的关键是需要对这些仅存在于客户端的Prehash字段执行regex验证和required字段验证(显然我不想以任何方式将这些字段传输到服务器)

因此,我手动创建这两个元素,并将data val-*属性添加到元素中,即它们不是由MVC助手生成的,等等。我猜这就是我遗漏的地方。当表单在所有字段都为空的情况下提交时,会弹出所有应该显示的错误,但表单仍会继续提交

==

所以我尝试过的事情:

是的,不引人注目的库parse()方法已经被调用来解析AJAX加载的表单内容,而且它似乎正确地获取了所有数据验证内容,因为我看到错误显示为fields blur(),当我点击submit时(在AJAX请求完成并替换弹出窗口的内容之前)

可能需要注意的是:在AJAX成功地将更改密码页面加载到弹出窗口中之后,调用不引人注目的库的解析方法。。。AJAX表单提交绑定放在文档上。加载内容就绪后,AJAX表单提交绑定可能会在验证调用之前绑定,从而在验证调用之前触发,解析方法可能会绑定到提交事件

然而,(1)我在其他地方做同样的事情,没有问题,唯一的区别是我手动将这些数据val-*属性放在我手动创建的元素上!以及(2),如果我在OldPassword或NewPassword字段上导致某种错误,例如,由于未向字段中加载值而导致必填字段验证错误,则它们将显示其错误,并通过jQuery.form方法成功停止表单提交

所以我认为这里一定有问题:

<input id="PrehashNewPassword" type="password" name="PrehashNewPassword" data-val-required="The password field is required." data-val-regex-pattern="<%= RegexHelper.PasswordRegularExpression %>" data-val-regex="<%= RegexHelper.PasswordRegularExpressionError %>" data-val="true" />

虽然这是可行的,但它有点丑陋,我相信它会导致验证被调用两次。。。没什么大不了的,但不太理想。那么,我是否需要在不引人注目的库中调用其他函数来绑定这些函数?

出于兴趣,如果您只是让表单进行验证,会发生什么

<script type="text/javascript">
    $("form").submit(function (evt) {

        // validate here should trigger invalid fields
        $('form').valid();

        // JSON POST...         

        // stop form submitting
        evt.preventDefault();
    });
</script>

$(“表格”)。提交(功能(evt){
//此处验证应触发无效字段
$('form').valid();
//JSON帖子。。。
//停止提交表格
evt.preventDefault();
});

不确定是否发现问题,但您可以尝试 返回错误 如果表格无效,请在此处输入

.
.
.
    if (!$('form').valid()) {
           return false;
    }

    // JSON POST...
.
.
.
如果这不起作用,那么您可以尝试使用:

$.validator.unobtrusive.parse($("#dynamicData"));
动态添加自定义输入后。“dynamicata”是环绕表单的元素的ID


上图:这是我正在做的事情的简单形式,是的。所有调用valid的操作都是运行验证并标记字段,但这并不能像我预期的那样(在我的所有其他表单上也是如此)阻止AJAX帖子的发生。。。不幸的是,这太简单了,无法引发我的问题。表单库为我处理这个问题(在其他地方都是正确的)。如果我明白你的意思,那么等价的方法就是调用$(“form”).valid();在这里提供的beforeSubmit方法中,这对停止AJAX帖子没有任何影响。也就是说,AJAX帖子似乎是在验证程序启动之前启动的,因为它本质上是异步的,所以验证程序的启动没有任何效果。通过在JQuery ajaxForm插件的“beforeSubmit”方法中显式调用.valid()方法,如果为false,则返回false,我可以在提交之前手动触发验证。验证仍然会触发两次,因为定期计划的验证程序会在这之后触发,但至少它会阻止表单提交。这是丑陋的,我仍然觉得我错过了什么,但它的工作。
$.validator.unobtrusive.parse($("#dynamicData"));