MVC Ajax - данные возврата при анализе формы - PullRequest
1 голос
/ 18 ноября 2009

Я использую 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. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 18 ноября 2009

Для получения реального вида HTML используйте:

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

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

0 голосов
/ 19 ноября 2009

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

Похоже, что лучшее решение - это просто сделать еще один GET (используя JQuery) и получить представление вручную.

0 голосов
/ 18 ноября 2009

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

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

        }

Код выше взят из здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...