2012-02-02 3 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» заменяются ответ (частичный вид снова). Но вместо того, чтобы внутренний HTML в сНе «divToReplace» заменяется ответом, поэтому начало частичного вида выглядит следующим образом:

<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

+0

Также взгляните на это: http://aspnet.codeplex.com/workitem/8767 – Andrei

+0

Ну, у меня было это раньше, но если 'update' может быть диалоговом окне jQuery или другим типом элемента управления, он сломается. – iappwebdev

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