2012-02-02 29 views
7

Trong một cái nhìn cục bộ, tôi đang sử dụng MVCs Ajax.BeginForm như sau:MVC Ajax.BeginForm Thay thế hành vi kỳ lạ

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

Khi submit form, tôi hy vọng rằng các div lỗ "divToReplace" được thay thế bằng câu trả lời (xem lại một phần). Nhưng thay vì html bên trong của div "divToReplace" được thay thế bằng câu trả lời, do đó, phần đầu của chế độ xem một phần trông như sau:

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

Tôi đang làm gì?

Trả lời

4

Vâng, sau một thời gian nhất định, tôi chạy vào cùng một vấn đề và bây giờ tôi muốn làm cho nó rõ ràng vì vậy tôi đã có một cái nhìn trong jquery.unobtrusive-ajax.js và chức năng 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; 
     } 
    }); 
} 

Như bạn thấy trong phần mặc định, câu trả lời không thay thế updatetargetid nhưng thay thế nội dung của nó bằng câu trả lời. Bây giờ tôi lấy phần bên trong của câu trả lời và mọi thứ đều hoạt động tốt!

+0

Sử dụng $ (cập nhật) .replaceWith ($ (dữ liệu)); thay thế. – Andrei

+0

Ngoài ra hãy xem điều này: http://aspnet.codeplex.com/workitem/8767 – Andrei

+0

Vâng tôi đã có trước đó, nhưng nếu 'cập nhật' có thể là một hộp thoại jQuery hoặc một loại điều khiển, nó bị hỏng. – iappwebdev

2

Chỉ cần thêm vào câu trả lời trước, bạn có thể thêm điều kiện của riêng bạn để jquery.unobtrusive-

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

và vượt qua của riêng bạn sử dụng tham số HtmlAttributes:

@using (Ajax.BeginForm("Action", "Controller", null, new AjaxOptions {UpdateTargetId = "DivContainer" } 
new { enctype = "multipart/form-data", data_ajax_mode = "replacewith" }