オプションのクライアント側検証を使用して実装しようとしています
- ASP.NET MVC 4、
- 控えめなjQuery検証、
- 控えめなJavaScript
これは正常に機能します
次の図は、オプションのクライアント側検証の意味を示しています。フォームの1つのフィールドにのみ電子メールが含まれていると予想されるため、電子メールバリデーターが添付されています。
次に、[保存]をクリックします。テキスト「name@doamin」は有効なメールアドレスではないため、検証の概要が表示されます。検証の概要とともに、 [とにかく保存]ボタンを非表示にします。
この2番目のボタンは、が付いている通常の送信ボタンですclass="cancel"
。jQuery.validate.js
これは、このボタンを使用して送信するときに検証をスキップするようにスクリプトに指示します。
ビューのコードスニペットは次のとおりです。
@using (Html.BeginForm())
{
<div>
<input data-val="true" data-val-email="Uups!" name="emailfield" />
<span class="field-validation-valid" data-valmsg-for="emailfield" data-valmsg-replace="false">*</span>
</div>
<input type="submit" value="Save" />
@Html.ValidationSummary(false, "Still errors:")
<div class="validation-summary-valid" data-valmsg-summary="true">
<input type="submit" value="Save anyway" class="cancel" />
</div>
}
これらはすべて正常に機能します。
問題
2番目の送信ボタン- 「とにかく保存」は、Ajaxフォームに切り替えると期待どおりに機能しなくなります。通常の動作と同じように動作し、検証が成功するまで送信を防ぎます。
「ajaxified」ビューのコードスニペットは次のとおりです。
@using (Ajax.BeginForm("Edit", new { id = "0" },
new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "ajaxSection",
}))
{
<div>
<input data-val="true" data-val-email="Uups!" name="emailfield" />
<span class="field-validation-valid" data-valmsg-for="emailfield" data-valmsg-replace="false">*</span>
</div>
<input type="submit" value="Save" />
@Html.ValidationSummary(false, "Still errors:")
<div class="validation-summary-valid" data-valmsg-summary="true">
<input type="submit" value="Save anyway" class="cancel" name="saveAnyway" />
</div>
}
違いを確認するためにデバッグjQuery.validation.js
しましたが、失敗しました。
質問
問題を修正または回避し、ajaxフォームを意図したとおりに動作させるためのアイデアは大歓迎です。
補遺
クライアント側の検証を行うことは絶対に必要です。サーバー側の検証はオプションではありません。トラフィックの増加(このサンプルは単純化されています。実際のフォームにははるかに多くのフィールドが含まれています)とレイテンシーの他に、サーバー側の検証では実行されないことが1つあります。クライアント側のバリデーターは、フォーカスが失われたときに誤ったフィールドを強調表示します。これは、次のフィールドにタブで移動するとすぐにフィードバックがあることを意味します。