序章
この投稿は、Microsoft MVC ヘルパーとネイティブの jquery ajax の混合に関するものです。途中で遭遇した主な問題は次のとおりです。
- 二重投稿投稿
- @Html.ValidationMessageFor
属性を出力しない
要件
フォームを検証して投稿する必要があります (id = "my-form")
フォームは検証属性で装飾されたモデルにバインドされているため、@Html.ValidationMessageFor などのヘルパー メソッドを利用して目立たないメリットを活用したいと考えています。
クライアント側とサーバー側の両方の検証が必要です (サーバー側ではデータベースで一意の名前チェックを行います)
フォームを送信して追加のフォーム データを追加するときに、クライアント側の処理を行う必要があります。
反復ステップ
ステップ1
ネイティブ jquery を使用せずに開始し、Microsoft ヘルパーを使用して ajax フォームを作成しました。
@using (Ajax.BeginForm( ...
すべてが宣伝どおりに機能しました。これにより、目立たない検証が行われましたが、カスタマイズされたフォーム データの投稿要件を満たしていませんでした。
そのため、送信プロセスをオーバーライドすると思いました。
ステップ2
ドキュメントの準備ができたら、新しいイベント ハンドラーを接続します。
$(document).ready(function ()
{
// Rebind validators
$.validator.unobtrusive.parse('#my-form');
// Hook up submit event
$("#my-form").submit(SubmitForm);
});
そして、私の送信機能では、独自のフォームデータ処理を行うことができます:
function SubmitForm(e)
{
// Suppress normal event behaviour
e.preventDefault();
// Validate the form
var valid = $("#my-form").validate();
if (valid.errorList.length > 0)
return;
// Collect up form data manually
var formData = ...(code removed for clarity)
// Display animated gif
$("#ajax-loader").css("display", "inline")
// Post Form
$.post(
'@Url.Action("MyAction", "MyController")', // url
formData, // data
SuccessFunction // success
)
.error(ErrorFunction); // error
}
さて、シーンは設定されました。
問題
1 つの問題は、2 種類の ajax を混在させていることです。これは二重投稿につながります。fiddler を使用すると、投稿が 2 回行われていることがわかります。(1 回は micosoft フォーム宣言用、もう 1 回は jquery 投稿用) 2 つのハンドラーが接続されているためです。少しグーグルで調べてみると、jqueryを使用して1つのハンドラーを削除している人がいることがわかりましたが、すべてが少し面倒に見えました。
ステップ3
そこで、@using (Ajax.BeginForm( ... 構文を単純なフォーム タグに変更しました。
<form id = "my-form">
...
</form>
問題
現在、 @Html.ValidationMessageFor は機能していません。firebug を使用すると、フォーム入力に検証属性が適用されていないことがわかります。
@Html.ValidationMessageFor は、フォーム ヘルパーと組み合わせてのみ機能するようです。
私は Ajax.BeginForm(... を使用できません。
ステップ4
だから私は次に使用しました:
@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new { id = "my-form" }))
{....
私は純粋に Html.BeginForm を使用して、@Html.ValidationMessageFor に処理を実行させています。カスタム イベント ハンドラーがフォーム送信プロセスを引き継ぐため、"MyAction" および "MyController" パラメーターはすべて冗長です。
解決済み
すべてが機能するようになりました
- 二重提出禁止
- @Html.ValidationMessageFor を使用した目立たない検証
- カスタマイズされたフォームの処理/送信
- クライアント側とサーバー側の検証
私の質問。
これは正しいアプローチですか?これらの線に沿って他の誰かの経験を聞くことに興味があります.
よろしく
フィル