0

フォームを含むモーダルポップアップがあります。ajax (jQuery を使用) 経由で送信されると、フォームが検証され、javascript コールバック関数がモデルが有効かどうかを確認します。そうであれば、モーダル ポップアップはリセットされて非表示になります。

jQuery ajaxSubmit と、POST 動詞のみを受け入れて PartialViewResult を返すアクションを使用して、ASP.NET MVC でこれを行っています。私は自分のサイトのいくつかの場所でこれを行っていますが、1 ページから 2 つのそのようなワークフローに問題があります。同じコードを使用して、一方は機能しますが、もう一方は機能しません。

問題は次のとおりです。

<% using (Html.BeginForm("ApplyPayment", "SomeController", FormMethod.Post, new { @id = "frmApplyPayment" })) { %>
    <%= Html.AntiForgeryToken(SomeSaltString) %>
    <%= Html.Hidden("ModelValid", ViewData.ModelState.IsValid) %>
    ...
<% } %>

デバッグ中に、検証エラーが発生したときに ViewData.ModelState.IsValid が false であっても、「#ModelValid」が「True」に設定されます。明示的に false に設定する多くの方法を試しました (ViewData.ModelState.IsValid ? "True" : "False" など)。変数がfalseでポップアップが非表示になっている場合でも、常にtrueになります。何が起こっている?

参照用のコードは次のとおりです。

function SubmitPaymentForm(form) {
    $(form).ajaxSubmit({ target: "#modalApplyPayment", success: CheckPaymentValidity  });
}

function CheckPaymentValidity(responseText) {
    if ($("#ModelValid").val() != "True") {
        ShowModalPopup("#modalApplyPayment");
    }
    else {
        HideModalPopup("#modalApplyPayment");
    }
}

これはすべて、電子メール機能の同じ基本ページから離れた非常によく似たワークフローで完全に機能します (アドレスを取得し、ajax 投稿で検証し、検証エラーが存在する場合はポップアップを表示するポップアップ)。

4

1 に答える 1

0

この問題の根本的な原因は、ページのポストバックおよび再レンダリング中に ModelState がどのように使用されるかに関係しています。私の検証システムは次の方法を使用します。

TrasnferValidationMessagesTo(ModelStateDictionary modelState,
                             IList<IValidationResult> results,
                             FormCollection formValues)
{
    // Set the ModelValue in modelState for each key in formValues

    // Add a ModelError for each error in results
}

ASP のエンジンは、ModelState コレクションの値を利用してフォームの値を再設定するように設計されていると思います。これにより、「#ModelState」非表示フィールドの明示的な設定がこっそり上書きされます (非表示フィールドはフォーム ポストバックでキャプチャされるため)。

驚いたことに、ModelState が以前の投稿から「#ModelValid」の「True」の値を保持している場合、コードを使用して明示的に「False」に設定しようとすると、機能しないことがわかりました。しかし、「False」から「True」に設定して逆にすると、うまくいきました。

私の解決策は、ModelValid プロパティをビュー モデルに追加し、デフォルトで false に設定し、検証エラーがない場合は true に設定し、それを使用して「#ModelValid」を変更することでした。手動の検証を使用し、ModelState が前の投稿のフォーム値で更新されなかったため、他のモーダル ポップアップで同じ問題は発生しませんでした。

于 2010-02-10T16:30:59.430 に答える