在局部视图中,我正在使用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 div“divToReplace”替换为答案(再次部分视图)。但相反,div“divToReplace”的内部html被答案所取代,因此部分视图的开头看起来像这样:
<div id="divToReplace">
<div id="divToReplace">
...
我做错了什么?
答案 0 :(得分: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,而是将其内容替换为答案。现在我采取答案的内部部分,一切正常!
答案 1 :(得分: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" }