ASP.NET MVC从POST方法渲染部分

时间:2010-07-20 10:48:42

标签: asp.net-mvc partial-views

问题

我有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方法渲染局部?因为现在使用该源代码选项卡内容将被加载到WHOLE页面,而不是加载到选项卡内。

解决方案

我不得不把DIV放在Ajax.Form之外,而且我的DropDownList上的提交也不正确。我做的是我创建了带有Id的隐藏提交按钮,然后我使用jQuery来执行它的点击事件。

2 个答案:

答案 0 :(得分:3)

如需更多参考,请参阅SO:

上的这个问题

MVC - Using Ajax to render partial view

这显示了Ajax.BeginForm的完整实现,包含周围的DIV和内部表单控件。您应该能够将这整个设置(DIV +表单+ HTML表单元素)放在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>
                    <%});

希望有所帮助。

答案 1 :(得分:1)

我做了我的低谷形式:

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

在后期行动

它工作得很好,在post上,action返回局部视图,然后ajax表单用InsertionMode.Replace替换UpdateTargetId中指定的div的内容