2012-02-02 52 views
7

在局部視圖中,我使用的MVCS Ajax.Beginform像如下: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> 

當提交表單,我希望的是,孔格「divToReplace」被替換答案(局部視圖)。而是在div「divToReplace」的內部HTML被替換的答案,所以局部視圖的開頭是這樣的:

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

我在做什麼錯?

回答

4

好了,一定時間後,我遇到了同樣的問題,現在我想講清楚,所以我不得不在jquery.unobtrusive-ajax.js一個外觀和功能RESPONSABLE:

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,而是用答案替換了它的內容。現在我採取答案的內在部分,一切正常!

+0

使用$(更新).replaceWith( $(數據));代替。 – Andrei 2012-12-06 22:33:49

+0

也看看這個:http://aspnet.codeplex.com/workitem/8767 – Andrei 2012-12-06 23:00:30

+0

嗯,我以前,但如果'更新'可能是一個jQuery對話框或其他類型的控制,它會被打破。 – iappwebdev 2012-12-07 07:35:08

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" }