ViewBags с использованием @Html.Action для отображения формы при частичном просмотре

Вид:

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

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

Частичный вид:

<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

Я получаю следующее:

Parent ViewData: From MemberSignupSubmit

PartialView ViewData: от MemberSignup

Если я использую @Html.Partial для рендеринга моего частичного представления, оба окна просмотра показывают одно и то же значение, установленное из действия отправки.

Я пробовал TempData, но тоже не работает. Действительно ли нет способа передать что-либо обратно в частичное представление после того, как я вернусь из действия отправки при использовании @Html.Action для отображения формы частичного просмотра.

Общая проблема, которую я пытаюсь решить, заключается в том, чтобы заполнить раскрывающийся список в моей форме значениями из базы данных. Использование @Html.Partial не позволяет мне это делать, но у меня есть рабочая область просмотра.


person CodeMonkey    schedule 30.05.2014    source источник


Ответы (1)


Я сделал это, чтобы отобразить динамический выпадающий список со значениями из базы данных. Может быть, это поможет кому-то.

Это музыкальный проигрыватель, которому требуется динамическое меню, заполненное БД, для отображения списков воспроизведения.

Я сделал базовый контроллер, от которого наследуются все остальные контроллеры. В этом базовом классе у меня есть действие PlaylistPopupMenu, которое получает список списков воспроизведения из базы данных.

    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>
person AndrewJE    schedule 27.08.2014
comment
Я пришел к такому же выводу. Разница между Html.Action и Html.ActionLink такая же, как и с Html.Partial и Html.PartialLink. ActionLink отображает все это как строку HTML. т.е. код не получает собственного контекста. Это также означает, что вы можете использовать ViewBag внутри обработчика запроса на отправку, поступающего из вашего частичного представления, и отображать его в родительском представлении, поскольку с ActionLink они существуют в том же контексте, в отличие от того, если бы вы использовали Action или Partial, тогда у частичного представления было бы свое собственный ViewBag и контекст. - person CodeMonkey; 01.09.2014