7

部分的なビューでは、次のように MVC Ajax.Beginform を使用しています。

<div id="divToReplace">
    @using (Ajax.BeginForm("Action", "Controller,
                           new AjaxOptions
                           {
                               InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace,
                               UpdateTargetId = "divToReplace"
                           },
                           new
                           {
                                id = "formID"
                           }))
    {
        ...
</div>

フォームを送信すると、ホール div "divToReplace" が回答に置き換えられることが期待されます (再び部分ビュー)。しかし代わりに、div "divToReplace" の内側の html が答えに置き換えられるため、部分ビューの始まりは次のようになります。

<div id="divToReplace">
    <div id="divToReplace">
           ...

私は何を間違っていますか?

4

2 に答える 2

4

さて、しばらくして同じ問題に遭遇したので、それを明確にしたかったので、jquery.unobtrusive-ajax.js と責任のある関数を調べました。

function asyncOnSuccess(element, data, contentType) {
    var mode;

    if (contentType.indexOf("application/x-javascript") !== -1) {  // jQuery already executes JavaScript for us
        return;
    }

    mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
    $(element.getAttribute("data-ajax-update")).each(function (i, update) {
        var top;
        switch (mode) {
            case "BEFORE":
                top = update.firstChild;
                $("<div />").html(data).contents().each(function () {
                    update.insertBefore(this, top);
                });
                break;
            case "AFTER":
                $("<div />").html(data).contents().each(function () {
                    update.appendChild(this);
                });
                break;
            default:
                // Changed this line because of generating duplicate IDs
                //$(update).html(data);
                $(update).html($(data).html());
                break;
        }
    });
}

デフォルトの部分でわかるように、答えは updatetargetid を置き換えるのではなく、その内容を答えに置き換えました。今、私は答えの内側の部分を取り、すべてがうまくいきます!

于 2012-05-11T12:53:12.433 に答える
3

前の回答に加えて、独自の条件を jquery.unobtrusive- に追加できます

ajax.js:
case "REPLACEWITH":
$(update).replaceWith(data);
break;

HtmlAttributes を使用して独自のパラメーターを渡します。

@using (Ajax.BeginForm("Action", "Controller", null, new AjaxOptions {UpdateTargetId = "DivContainer" }
new { enctype = "multipart/form-data", data_ajax_mode = "replacewith" }
于 2014-08-21T13:32:46.770 に答える