0

我正在使用Ajax.BeginForm助手。它运作良好,但我有一个小问题。

这是代码:

<div class="row" id="pdiv">
@using (Ajax.BeginForm("SomeAction","SomeController",new AjaxOptions{UpdateTargetId="pdiv"}))
{
.....
}
</div>

我已将 UpdateTargetId 设置为“pid”。

所以最初渲染的 HTML 看起来像:

<div class="row" id="pdiv">
<form action="/SomeController/SomeAction" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#pdiv" id="form0" method="post">
....

现在,当我提交时,它会将整个 pid div 放在 pid 中。IE

<div class="row" id="pdiv">
    <div class="row" id="pdiv">
    <form action="/SomeController/SomeAction" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#pdiv" id="form0" method="post">
    .....
    }

我尝试设置 Ajax 选项InsertionMode= InsertionMode.Replace 但没有成功。无论如何,我可以用新获得的内容完成“pdiv”的替换吗?

4

2 回答 2

1

您需要将您的 ajax 表单标记移动到单独的视图中,因此它不会包含您在目标 ID 中指定的 div 元素,然后您应该从您的 ajax 操作中提供新的部分视图。

于 2014-01-31T11:33:56.553 回答
1

根据Simon在StackOverflow中的这篇文章

好吧,过了一段时间,我遇到了同样的问题,现在我想弄清楚,所以我查看了 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 而是用答案替换了它的内容。现在我采用答案的内部部分,一切正常!

于 2014-01-31T11:37:20.543 回答