2012-02-02 13 views
7

W częściowym widokiem używam MVCs Ajax.BeginForm jak następuje:MVC Ajax.BeginForm Wymień dziwne zachowanie

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

Po wysłaniu formularza, bym się spodziewał, że div dziura „divToReplace” zastępuje się wyrazami odpowiedź (widok częściowy ponownie). Ale zamiast wewnętrzna html div „divToReplace” zastępuje się odpowiedzi, więc początek częściowym widokiem wygląda następująco:

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

Co robię źle?

Odpowiedz

4

Cóż, po pewnym czasie, wpadłem na ten sam problem i teraz chciałem, aby było jasne, więc musiałem spojrzeć w jquery.unobtrusive-ajax.js i funkcję odpowiedzialni:

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; 
     } 
    }); 
} 

Jak widać w części domyślnej, odpowiedź nie zastępuje aktualizacji updatetargetid, ale zastępuje jej treść odpowiedzią. Teraz biorę wewnętrzną część odpowiedzi i wszystko działa dobrze!

+0

użycie $ (aktualizacja) .replaceWith ($ (dane)); zamiast. – Andrei

+0

Zobacz także: http://aspnet.codeplex.com/workitem/8767 – Andrei

+0

Cóż, miałem to wcześniej, ale jeśli 'update' może być dialogiem jQuery lub innym typem kontroli, to jest zepsute. – iappwebdev

2

tylko dodatkiem do poprzedniej odpowiedzi, można dodać własny warunek jquery.unobtrusive-

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

i przekazać własne parametrów za pomocą HtmlAttributes:

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