【问题标题】:MVC Ajax.BeginForm Replace strange behaviourMVC Ajax.BeginForm 替换奇怪的行为
【发布时间】:2012-02-24 23:58:47
【问题描述】:

在部分视图中,我正在使用 MVCs 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">
           ...

我做错了什么?

【问题讨论】:

    标签: asp.net-mvc replace insertion ajax.beginform


    【解决方案1】:

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

    【讨论】:

    • 我以前也有过,但如果update 可能是一个 jQuery 对话框或其他类型的控件,它就会损坏。
    【解决方案2】:

    除了之前的答案,你可以将自己的条件添加到 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" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 2011-09-21
      • 2012-08-31
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多