问题是,当表单无效时,GC和FF没有触发表单的提交事件,因此我在此事件期间禁用了提交按钮.但是,IE8会触发此事件,导致用户永远无法再次单击它. (IE8不提交表单,但事件被解雇.)
我尝试将一个函数附加到提交按钮的单击事件.在那里,我禁用了提交按钮,显示了等待图标,并且具有:
$('[data-app-form-submit-button="true"]').live('click',function (e) { var form = $(this).parents('form'); var icon = form.find('[data-app-form-submitting-icon="true"]'); icon.show(); $(this).attr('disabled','disabled'); $.ajaxSetup({ async: false }); var isValid = form.valid(); $.ajaxSetup({ async: true }); alert(isValid); });
问题是,ajax设置调用并没有真正关闭异步.如果我将它移出click函数,但它会禁用所有内容的异步.相反,页面立即警告“true”,通过在远程验证操作方法上设置断点进行测试.
有任何想法吗?
附加说明:
我忘了提到,在IE8中,当有问题的文本框未能在客户端上进行验证时,才会触发提交事件.例如,如果它不需要或正则表达式,则触发submit().对于远程验证操作方法,不会触发它.但是,一旦客户端验证失败,后续远程验证也会触发IE8提交事件.
对Russ Cam的回应(评论#1)
public class SignUpForm : IValidatableObject { [DataType(DataType.EmailAddress)] [Display(Name = "Email Address")] [required(ErrorMessage = "Email Address is required.")] [RegularExpression(@"^(email regex here)$",ErrorMessage = "This is not a valid email address.")] [Remote("Validate","ControllerName","AreaName",HttpMethod = "POST")] public string EmailAddress { get; set; } public IEnumerable<ValidationResult> Validate( ValidationContext validationContext) {
我很高兴你让我看看渲染的< form>.表单标记和输入元素如下所示:
<form action="/post-action-method" method="post" novalidate="novalidate"> ... <input class="text-Box single-line" data-app-focus="true" data-val="true" data-val-regex="This is not a valid email address." data-val-regex-pattern="^(email regex here)$" data-val-remote="&#39;Email Address&#39; is invalid." data-val-remote-additionalfields="*.EmailAddress" data-val-remote-type="POST" data-val-remote-url="/validate-action-method" data-val-required="Email Address is required." id="EmailAddress" name="EmailAddress" type="text" value=""> ... <input type="submit" value="Submit this form" data-app-form-submit-button="true" />
到目前为止,我从未见过novalidate =“novalidate”属性.以下是cshtml文件中的内容:
@using (Html.BeginForm()) { @Html.EditorForModel() @Html.AntiForgeryToken("assault") }
我也使用防伪令牌,如果这有所作为.谢谢.
解决方法
首先,使用display =“none”隐藏提交按钮,并显示您自己的“提交”按钮,该按钮在上面运行您的脚本.
其次,在你的页面中,添加一个标志var [var remotePending = false;]和一个setInterval调用的变量[var intervalPending;],并在你的脚本中,将标志设置为true,然后使用intervalPending = setInterval调用以下函数(‘remoteCheck()’,200);
function remoteCheck() { if ($.validator.pendingRequest == 0) { // requests are done // clear interval clearInterval(intervalPending); // re-enable our "submit" button // "click" the hidden button $("#hiddenSubmit").click(); } // we will try again after the interval passes }
这将允许您等待挂起的远程验证完成,然后正常进行.我没有测试过,所以你可能需要四处游戏才能让它按照你的意愿运行.