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 では、送信イベントは、問題のテキスト ボックスがクライアントで発生する可能性のある検証に失敗した場合にのみ発生します。たとえば、required または regex に失敗すると、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 タグと入力要素は次のようになります。
<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")
}
それが違いを生む場合、私は偽造防止トークンも使用しています。ありがとう。