MVC 3 StackOverflowException w / @ Html.Action () - PullRequest
0 голосов
/ 22 сентября 2011

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

// The Controller

[ChildActionOnly]
public ActionResult _EditBillingInfo()
{
    // Generate model
    return PartialView(model);
}

[HttpPost]
public ActionResult _EditBillingInfo(EditBillingInfoViewModel model)
{
    // Update billing informatoin
    var profileModel = new EditProfileViewModel()
    {
        PartialToLoad = "_EditBillingInfo"
    };

    return View("EditProfile", profileModel);
} 

[ChildActionOnly]
public ActionResult _EditUserInfo()
{
    // Generate model
    return PartialView(model);
}

[HttpPost]
public ActionResult _EditUserInfo(EditUserInfoViewModel model)
{
    // Update user informatoin
    var profileModel = new EditProfileViewModel()
    {
        PartialToLoad = "_EditUserInfo"
    };

    return View("EditProfile", profileModel);
}

public ActionResult EditProfile(EditProfileViewModel model)
{
    if (String.IsNullOrEmpty(model.PartialToLoad))
    {
        model.PartialToLoad = "_EditUserInfo";
    }

    return View(model);
}

// EditProfile View
@model UPLEX.Web.ViewModels.EditProfileViewModel

@{
    ViewBag.Title = "Edit Profile";
    Layout = "~/Views/Shared/_LoggedInLayout.cshtml";
}

<div>
    <h2>Edit Profile</h2>

    <ul>
        <li class="up one"><span>@Ajax.ActionLink("Account Information", "_EditUserInfo",
            new AjaxOptions { UpdateTargetId = "EditProfileDiv", LoadingElementId = "LoadingImage" })</span></li>
        <li class="up two"><span>@Ajax.ActionLink("Billing Information", "_EditBillingInfo",
            new AjaxOptions { UpdateTargetId = "EditProfileDiv", LoadingElementId = "LoadingImage" })</span></li>
    </ul>
    <img alt="Loading Image" id="LoadingImage" style="display: none;" src="../../Content/Images/Misc/ajax-loader.gif" />

    <div id="EditProfileDiv">
        @Html.Action(Model.PartialToLoad)
    </div>
</div>

Частичные представления являются обеими формами для обновления либо пользовательской информации, либо платежной информации.

Я отлаживал это и обнаружил, что происходит, но не могу понять, почему.Когда пользователь просматривает EditProfile, он загружается с частичным _EditUserInfo, и форма там для редактирования.Когда вы изменяете некоторую информацию и отправляете форму, она зависает, и вы получаете StackOverflowException в представлении EditProfile при вызове @Html.Action().Что происходит при первом посещении EditProfile, @Html.Action вызывает версию _EditUserInfo HttpGet.Вы вносите некоторые изменения в информацию о пользователе и нажимаете кнопку Отправить.Как только информация обновляется, снова возвращается представление EditProfile, но на этот раз @Html.Action вызывает версию HttpPost _EditUserInfo, которая снова обновляет информацию о пользователе, снова возвращает представление EditProfile, а @Html.Action вызывает версию HttpPost _EditUserInfo ...Вы получите, где это происходит.Почему после отправки формы она вызывает почтовую версию, а не версию get, как это было при первоначальном посещении EditProfile?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 23 сентября 2011

Возможно, я немного ошибаюсь, это был долгий день, но в EditProfile вы устанавливаете PartialToLoad (если он пуст) в "_EditUserInfo", затем в _EditUserInfo вы снова устанавливаете в _EditUserInfo, не создаст ли это цикл, который ведет себя как то, что вы испытываете?

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