3

この例のように ASP.NET 部分ビューを使用しています

<% using (Html.BeginForm()) { %>
    <table cellspacing="2" cellpadding="0" border="0" width="100%">
    <tr>
        <td><%= Html.LabelFor(model => model.PersonName)%></td>
        <td>
            <%= Html.TextBoxFor(model => model.PersonName)%>
            <%= Html.ValidationMessageFor(model => model.PersonName, "*")%>
        </td>
    </tr>
    ...
    <tr><td colspan="2"><%= Html.ValidationSummary(false) %></td></tr>
    </table>
<% } %>

これらの部分ビューを jquery コードを使用して呼び出す Jquery ダイアログに表示します

$.ajax({
    type: "get",
    dataType: "html",
    url: urlAction,
    data: {},
    success: function(response) {
        $("#panelDetail").html('').html(response).dialog('open');
    }
});

すべてが機能し、私を幸せにしてくれます。jquery ajax を使用してフォームを送信することもできるので、さらに満足しています。:)

本当に厄介なのは、検証が発生すると、ページが完全に更新されてダイアログが閉じられるため、検証がどこで発生するのか理解できなかったことです。

誰かがこれを手伝ってくれると確信しています。とにかく....誰になるの?:)

前もって感謝します!

編集

これは、いくつかのコードを含むコントローラー アクション シグネチャです。

[HttpPost]
public ActionResult MyAction(FormCollection form) {
    string foroID = form["ForoId"];
    string foro = form["Foro"];
    string authorityId = form["AuthorityId"];
    string sezione = form["Sezione"];
    ...
}

検証するためにモデル クラスを再作成する必要がありますか?

4

2 に答える 2

3

まず第一に、クライアント検証を使用している場合、最初のチェックはすでに JavaScript を使用してクライアント側で行われていますが、データの入力中に検証でエラーが表示されます。

第二に、コントローラーアクションに送り返されるデータは、アクションがPartialViewモデルタイプとして持っているものと同じタイプのパラメーターを取る限り、その特定の時点で検証されています。このタイプ (クラス) にプロパティにアタッチされたデータ注釈がある場合、それらは検証されています。もちろん、アクションのモデル エラーをチェックし、それに応じて行動する必要があります。

リダイレクト?コントローラー アクションのコードをもう少し提供していただければ、何が起こっているかをより簡単に確認し、追加のヘルプを提供できます。

この状況をどのように処理したか

モデル状態エラーをチェックし、エラーの説明とともに 400 をクライアントに返す特別なアクション フィルターを作成しました。私のすべての Ajax 呼び出しは、応答とsuccess同様に処理し、それに応じて動作します。error

こちらのコードを確認してください(質問と解決策)

実際の解決策

このソリューションは、以下のコメントから取得した追加情報に基づいています

したがって、議論の結果、問題は実際にはページ全体のポストバックではなく、まったく行われなかった検証です。その理由は、コントローラーのアクションが type のパラメーターを取るためFormCollectionです。MVC フレームワークには、そのデータを検証する方法を知る知識がまったくないため、検証は行われません。

必要な変更は、このパラメーターの型を変更して、厳密な型ビューに一致させることです。ビューがタイプのViewPage<MyCustomType>場合、HttpPostアクションにはおそらく同じタイプのパラメーターが必要です。

一般に、アクション タイプは任意のタイプのパラメータを持つことができます。はい、さらに多くのパラメーターを持つことができます。唯一の制限は、デフォルトのモデル バインダーが投稿されたデータをこれらのパラメーターに関連付けることができるということです。これがあなたの出番です。パラメーターに適切な名前を付けるだけで、後はモデル バインダーが行います。

これが簡単にできない特定の状況に遭遇した場合は、いつでも特定の型のカスタム モデル バインダーを作成できます。投稿されたデータを解析する方法は完全にあなた次第です。

于 2010-09-08T00:09:41.610 に答える
1

ロバートの提案をここに

ダイアログ ボックスを閉じる前に、ajax を介してフォームを送信したときのサーバーの応答を確認してから、ダイアログを閉じる前に、応答が有効か無効かを確認してからdialog('close')、ダイアログを呼び出します。ダイアログの他のすべての状況でも同じです。

于 2010-09-08T00:21:25.907 に答える