0

シンプルな CRUD アプリケーションを作成しようとしています。行を移入する部分ビューがあります。各行には、クリックすると編集リンクがあり、jqueryダイアログを開いています。このダイアログでは、対応する行を編集するために別の部分ビューを読み込みます。[OK] ボタンでフォーム (Ajax フォーム) を投稿します。

updateTargetId (これは、リストがレンダリングされる div です) を提供しているため、コントローラーは元のリスト (リストの部分ビュー) を置き換えると思われる別の部分ビューを返します。

ここで私は2つの問題に直面しています、

  1. これは初めて機能します (つまり、セッションで初めて) フォームを投稿します。編集のために別のレコードを開くと、フォームは正しく読み込まれますが、投稿すると、最初の試行で投稿されたレコードの値がフォームに常に含まれます。
  2. 投稿が成功した後でも、リストは更新されません。フィドラーで投稿の応答を見ることができます。リストは、ブラウザを更新した後にのみ更新されます。

modelState をクリアしようとしましたが、うまくいきません。jquery コードのデバッグを試みたところ、form.serialize には古い値が含まれているため、コントローラーは常にそれらの値を取得することがわかりました。

どこかでフォームをキャッシュしていると思います。次に、追加してキャッシュをオフにしました

$.ajaxSetup({ cache: 'false' });

document.ready で。それもうまくいきません。

ここにjQueryコードがあります

this.bindOpenDialog = function () {
    $(".openDialog").click(function (e) {
        e.preventDefault();
        var height = $(this).attr("data-dialog-height");
        var width = $(this).attr("data-dialog-width");
        var data_postUrl = $(this).attr("data-postUrl");
        var data_returnUrl = $(this).attr("data-returnUrl");
        var data_updateTarget = $(this).attr("data-updateTarget");
        var data_form_id = $(this).attr("data-form-id");
        var callBack = $(this).attr("callBack");
        if (data_postUrl == '') {
            data_postUrl = this.href;
        }
        var div = $("<div></div>");
        div.addClass("ui-dialog")
        div.attr("id", $(this).attr("data-dialog-id"))
        var dialog = div.dialog({
            title: $(this).attr("data-dialog-title"),
            close: function () { $(this).remove() },
            height: height,
            width: width,
            modal: true,
            buttons: {
                'Save': function () {
                    var dialog = $(this);
                    var form = null;
                    if (data_form_id == '' || data_form_id == undefined) {
                        form = dialog.find('form').first();
                    }
                    else {
                        form = $("#" + data_form_id).first();
                    }

                    var req = $.post(data_postUrl, form.serialize(),
                        function (responseText, textStatus) {
                        }, "html");
                    req.success(function (data) {
                        if (callBack == '' || callBack == undefined) {
                            dialog.dialog('destroy');
                        }
                        else {
                            var cb = eval(callBack + "()");
                            dialog.dialog('destroy');
                        }
                    });
                    req.success(function (data) {
                        if (callBack == '' || callBack == undefined) {
                            thisDialog.dialog('destroy');
                        }
                        else {
                            var cb = eval(callBack + "()");
                            thisDialog.dialog('destroy');
                        }
                        //remove the form from the DOM.
                        //If I do not do this, it always posts the
                        // form which was posted for the first time.
                        $("#" + data_form_id).remove();
                    });
                    req.error(function (e) {
                        alert('error ' + e.toString())
                    });
                },
                'Cancel': function () {
                    var dialog = $(this);
                    dialog.dialog('destroy');
                }
            }

        });
        dialog.load(this.href);
    }
);

すでにこの問題に直面している団体はありますか?

私のもう 1 つの観察結果は、jQuery がターゲットを更新していないことです。また、起動しない Ajax フォームに OnSuccess イベントを設定しました。


私のもう 1 つの観察結果は、jQuery がターゲットを更新していないことです。また、起動しない Ajax フォームに OnSuccess イベントを設定しました。

4

3 に答える 3

0

了解しました。これを共有したいのですが、私はAjax.BeginFormを使用しています。このフォームをjqueryダイアログで開いています。このダイアログには、[OK]ボタンと[キャンセル]ボタンがあります。[OK]をクリックすると、ajaxフォームを投稿します。それがdivを更新しない理由です。II送信ボタンを使用してこのフォームを投稿すると、機能します。

つまり、Ajax.Beginフォームを使用している場合は、ターゲットを更新してOnCompleteイベントでスクリプトを実行するために、送信ボタンを使用してフォームを投稿する必要があります。

他のボタンを使用してフォームを送信すると、この利点を利用できなくなります。この場合、javascriptで行う必要があります。

これが誰かに役立つことを願っています。

(私はこれをこの投稿に注意を引くための答えとしてマークしています。)

于 2013-01-15T11:20:03.353 に答える
0

それが最善の方法であるかどうかはわかりませんが、javascript でダイアログを破棄した後に DOM からフォームを削除すると。jqueryはフォームインスタンスをキルしていないと思います

今私のjavascriptは次のようになります

req.success(
            function (data) {
                if (callBack == '' || callBack == undefined) {
                    thisDialog.dialog('destroy');
                }
                else {
                    var cb = eval(callBack + "()");
                    thisDialog.dialog('destroy');
                }
                //remove the form from the DOM.
                //If I do not do this, it always posts the form which was posted for the first time.
                $("#" + data_form_id).remove();
            }
        );

より良いアプローチがあれば、誰にもアドバイスできますか?

よろしく、 マヘシュ

于 2013-01-13T00:14:59.933 に答える
0

属性を使用して編集し、ソリューションを再構築するための部分ビュー (編集用およびリスト用) を返す Mark メソッド:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
于 2013-01-13T00:17:04.990 に答える