ViewBags使用@ Html.Action在局部视图上渲染表单

时间:2014-05-30 08:40:26

标签: asp.net-mvc-4 asp.net-mvc-partialview umbraco6

查看:

<p>Parent ViewData: @ViewData["Test"]</p>   

@Html.Action("MemberSignup","MemberSignupSurface")

PartialView:

<p>PartialView ViewData: @ViewData["Test"]</p>  

@using (Html.BeginUmbracoForm<MemberSignupSurfaceController>
    ("MemberSignupSubmit", "MemberSignupSurfaceController",FormMethod.Post))
{
    <!-- Some form controls -->
    <input type="submit" value="Signup" />
}

控制器:

public class MemberSignupSurfaceController : SurfaceController
{
    public ActionResult MemberSignup()
    {
        ViewData["Test"] = "From MemberSignup";
        // Do database stuff and create model from that
        return PartialView("MemberSignupView", model);
    }


    [HttpPost]
    public ActionResult MemberSignupSubmit(MemberViewModel model)
    {
        ViewData["Test"] = "From MemberSignupSubmit";

        if (ModelState.IsValid)
        {
             // Redirect to success using TempData
        }
        else
        {
            return CurrentUmbracoPage();
        }                                            
    }       
}

当我的页面加载MemberSignup被调用且页面显示

父ViewData:

PartialView ViewData:来自MemberSignup

然后,当我使用无效输入在部分视图上提交表单时,它将无法验证,并在操作CurrentUmbracoPage()中调用MemberSignupSubmit

我得到以下内容:

父ViewData:来自MemberSignupSubmit

PartialView ViewData:来自MemberSignup

如果我使用@Html.Partial呈现我的局部视图,则两个viewbags都会显示与提交操作相同的值集。

我已经尝试了TempData,但它也没有用。在使用@Html.Action渲染部分视图表单时,从提交操作返回后,是否真的无法将任何内容传递回局部视图。

我想解决的整体问题是使用数据库中的值弹出表单中的下拉列表。使用@Html.Partial不允许我这样做,但有一个工作视图包。

1 个答案:

答案 0 :(得分:0)

我这样做是为了使用数据库中的值呈现动态下拉列表。也许它会帮助别人。

这是一个音乐播放器,需要动态数据库填充菜单才能列出播放列表

我制作了一个所有其他控制器继承的基本控制器。在该基类中,我有一个PlaylistPopupMenu操作,它从db获取播放列表列表。

    public PartialViewResult PlaylistPopupMenu()
    {
        try
        {
            return PartialView("_PlaylistPopupMenu", db.GetPlaylists(1).ToList());
        }
        catch (Exception)
        {
            throw;
        }
    }

然后我有一个_PlaylistPopupMenu局部视图,如下所示:

@model List<OneMusic.Models.GetPlaylists_Result>
@if (Model.Count > 0)
{
    <li style="height:2px" class="divider"></li>
    foreach (var item in Model)
    {
        <li style="height:30px">@Html.DisplayFor(p => item.Name)
            @Html.ActionLink(item.Name, "AddSong", "Playlist", new { playlistId =       @item.PlaylistId, songId = 1 }, "") 
       </li>
    }
}

这会呈现菜单的动态部分(即播放列表)

最后,主页面用于构建菜单的动态部分:

<ul class="dropdown-menu" style="margin-top:10px"><p class="text-primary" style="margin-left:18px; margin-top:6px">Add To</p>

    <!-- other static menu items here-->

    <li style="margin-top:-60px; height:0px">@Html.Action("PlaylistPopupMenu")</li>
</ul>