Частичный рендеринг ASP.NET MVC из метода POST

Проблема

У меня есть Telerik TabControl, и содержимое каждой вкладки является частичным. При запросе GET все работает без сбоев:

//
// GET: /ProductVersion/Translations        
public ActionResult Translations(Guid id)
{
    VersionEditTabViewModel model = CreateTranslationsViewModel(id);
    return PartialView("Translations", model);
}

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

[HttpPost]
public ActionResult Translations(Guid id)
{
    FormCollection formCollection = new FormCollection(Request.Form);
    string message = string.Empty;
    int languageId = int.Parse(formCollection["TranslationsLanguageList"]);
    string action = formCollection["TranslationAction"];
    if(action == Constants.translation_save)
    {
        _translationModel.SaveTranslations(formCollection);
        message = "Translation information saved";
    }
    else if (action == Constants.translation_language_changed)
    {
/*
    PROBLEM: causes whole page to render, not partial
*/
        return PartialView("Translations", model);
    }
    return RedirectToAction( ... updates the complete page not only partial ...);
}

У меня вопрос: как отрендерить партиал методом POST? Потому что теперь с этим исходным кодом содержимое вкладки будет загружено на ВСЕ страницу, а не внутри вкладки.

Решение

Мне пришлось разместить DIV за пределами Ajax.Form, а также у меня была неправильная отправка в моем DropDownList. Что я сделал, так это то, что я создал скрытую кнопку отправки с идентификатором, а затем использовал jQuery для выполнения этого события щелчка.


person Tx3    schedule 20.07.2010    source источник


Ответы (2)


Для получения дополнительной информации, пожалуйста, обратитесь к этому вопросу о SO:

MVC - Использование Ajax для визуализации частичного представления

Здесь показана полная реализация Ajax.BeginForm с окружающими элементами управления DIV и внутренней формой. Вы должны иметь возможность разместить всю эту настройку (DIV + Form + HTML Form Elements) на вкладке Telerik, например:

<% Html.Telerik().TabStrip()
        .Name("TabStrip")
        .Items(tabstrip =>
        {
            tabstrip.Add()
                    .Text("Your Tab Text")
                    .Content(() =>
                    {%>
                        <div id="containerDiv" align="left">
                           <% using (Ajax.BeginForm("Example", "Controller/Action", new AjaxOptions { UpdateTargetId = "containerDiv" })){ %>
                           <%-- Render Partial here -->
                           <% } %>
                        </div>
                    <%});

Надеюсь, это поможет.

person Todd    schedule 21.07.2010
comment
Я проверил ссылку, которую вы разместили. Я провел небольшой тест и добавил кнопку отправки вместо того, чтобы иметь только DropDownList с отправкой, добавленной с помощью jQuery. По какой-то причине кнопка отправки ведет себя иначе, чем DropDownList, когда отправка завершена. Мне нужно исследовать еще немного. Я дам тебе знать, когда решу (наконец) - person Tx3; 22.07.2010
comment
У меня тоже были другие ошибки, как вы указали в примере. Div должен находиться за пределами Ajax.BeginForm. Большое спасибо Тодду! - person Tx3; 22.07.2010

Я сделал свою форму ajax:

using (Ajax.BeginForm("*ActionName*", new { *parameter = ID* }, new AjaxOptions { UpdateTargetId = (*div i will update*), OnSuccess = "*JavaScript that executes on success*", OnComplete = "s*ame as on success*", InsertionMode = InsertionMode.Replace }))

а потом у меня есть

return PartialView("*PartialViewName*", model);

в посте Действие

И он работает нормально, при публикации действие возвращает частичное представление, а затем форма ajax заменяет содержимое div, указанного в UpdateTargetId, на InsertionMode.Replace

person Nikola Markezic    schedule 20.07.2010
comment
Спасибо за ваш ответ. Я еще не приступил к работе. Вот что я добавил: ‹% using (Ajax.BeginForm (Переводы, новый {Model.Id}, новый AjaxOptions {UpdateTargetId = translationContent, InsertionMode = InsertionMode.Replace})) {%› ‹div style = width: 100%; высота: 100%; id = translationContent ›... blaa blaa content blaa .. ‹/div›‹%}% ›На стороне контроллера у меня есть: return PartialView (Переводы, модель); - person Tx3; 21.07.2010
comment
Он по-прежнему меняет все содержимое страницы - person Tx3; 21.07.2010
comment
мой целевой идентификатор обновления - это div, обертывающий всю форму, и я получил его так: ‹div id = content› ‹% Html.RenderPartial (PartialView, model); ‹/Div› тогда, когда я публикую, return - это частичный вид, поэтому вам нужно заменить старый отрендеренный частичный вид новым: D - person Nikola Markezic; 21.07.2010