2009-11-18 4 views
1

Я использую MVC Ajax для отправки формы. То, что я не могу получить, - заставить Action на сервере вернуть частичный вид в браузер.MVC Ajax - Форма представления представления данных возврата

Форма представления выглядит следующим образом:

<% using (Ajax.BeginForm("Add", "Example", new AjaxOptions { HttpMethod = FormMethod.Post.ToString(), OnComplete = "widgetAdded" })) { %> 

Это поражает сервер и действие запускается на выполнение. Метод JavaScript «widgetAdded», который запускается на выполнение после того, как действие завершает выглядит примерно так:

function widgetAdded(ajaxContext) { 
    var response = ajaxContext.get_response().get_object(); 
    alert(response); 
} 

Если я возвращаю результат JSON в действии, как это, он работает - предупреждение показывает данные которые передаются от сервера ,

return Json("bob"); 

Теперь, если я изменю действие, чтобы вернуть PartialView, это не работает.

return PartialView("Widgets"); 

Я пытался допросить объект ответа в Firebug, но я не могу показаться, чтобы получить фактический вид HTML. Есть идеи?

ответ

0

Я сделал еще несколько исследований и, похоже, вернуть ответ в ответ на действие POST не представляется возможным. Я посмотрел на фактический ответ, отправляемый клиенту - если я верну строку (как Json), заголовок ответа фактически заполняется - если я верну представление, заголовок ответа пуст.

Кажется, что лучшим решением является просто выполнить другое GET (используя JQuery) и получить представление вручную.

0

Вы могли бы сделать ваше частичное представление в строку и возвращает строку:

 public static string RenderPartialToString(string controlName, object viewData, object model, System.Web.Routing.RequestContext viewContext) 
     { 

      ViewDataDictionary vd = new ViewDataDictionary(viewData); 
      ViewPage vp = new ViewPage { ViewData = vd }; 

      vp.ViewData = vd; 
      vp.ViewData.Model = model; 
      vp.ViewContext = new ViewContext(); 
      vp.Url = new UrlHelper(viewContext); 

      Control control = vp.LoadControl(controlName); 

      vp.Controls.Add(control); 

      StringBuilder sb = new StringBuilder(); 

      using (StringWriter sw = new StringWriter(sb)) 
      { 

       using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
       { 

        vp.RenderControl(tw); 

       } 

      } 

      return sb.ToString(); 

     } 

код выше, взятый из here

+0

Кажется, что это может сработать, но это также кажется довольно грязным. Разве мы не можем это сделать без этой дополнительной работы? –

0

Чтобы получить фактическое использование просмотр HTML:

alert(ajaxContext.get_response().get_responseData()); 

Функция get_object() работает только с содержимым JSON.

+0

get_responseData возвращает пустую строку для меня –

Смежные вопросы