【发布时间】:2011-10-20 18:44:47
【问题描述】:
在 MVC3 应用程序中,使用 jquery 不显眼的验证,以及带有 [Remote] 验证器的视图/模型:我正在尝试禁用提交按钮并在远程验证期间显示等待图标,并且在提交有效表单时服务器。我以为我已经搞定了,直到我在 IE8 中尝试了它。
问题是,当表单无效时,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 设置调用并没有真正关闭异步。如果我将它移出点击功能,它会这样做,但它会禁用所有内容的异步。相反,页面会立即发出“true”警报,通过在远程验证操作方法上设置断点进行测试。
有什么想法吗?
补充说明:
我忘了提到,在 IE8 中,仅当相关文本框未能通过客户端上可能发生的验证时才会触发提交事件。例如,如果要求失败或正则表达式失败,则触发 submit()。对于远程验证操作方法,它不会被触发。但是,一旦客户端验证失败,后续的远程验证也会触发 IE8 提交事件。
对 Russ Cam 的回应(评论 #1)
下面是viewmodel中的相关代码:
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")
}
我也在使用防伪令牌,如果这会有所不同的话。谢谢。
【问题讨论】:
-
您能否同时显示视图模型代码和视图中的
<form>? -
发布了视图模型和渲染的 html,以及 cshtml 源代码。是 jquery validate 还是可以添加 novalidate 属性的不显眼的适配器?
-
我以前从未见过 novalidate。它在 MVC 3 源代码中不存在。您还安装了哪些其他软件包?
-
是的,我在所有表单中都看到了它。也许我应该开始一个新问题。 MVC 应用程序中的包:AutoMapper、CommonServiceLocator、ELMAH Core Library、Elmah.Contrib.Mvc、EF4.1、jQuery、jq UI、jq Validation、jq Visual Studio 2010 Intellisense、MicrosoftWebMvc、Modernizr、Mvc Html5 Templates、Mvc2Futures、MvcScaffolding、T4MVC 、T4Scaffolding、Unity、Windows Azure AppFabric 缓存、Windows Azure Web 角色。
-
找到了,jquery.validate 1.9.0。刚升级。来自 jquery.validate.js,第 32 和 33 行://如果 HTML5,则添加 novalidate 标记。 this.attr('novalidate', 'novalidate');
标签: jquery asp.net-mvc-3 jquery-validate unobtrusive-validation remote-validation