MVC 3 StackOverflowException w / @ Html.Action()

时间:2011-09-22 17:13:35

标签: asp.net-mvc forms asp.net-mvc-3 partial-views stack-overflow

我已经查看过其他一些关于此的报告,但我的行为似乎有点不同。我正在为子操作返回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部分,表单可供编辑。当您更改某些信息并提交表单时,它会挂起,并在调用@Html.Action()时在EditProfile视图中收到StackOverflowException。在初次访问EditProfile时会发生什么,@Html.Action调用_EditUserInfo的HttpGet版本。您对用户信息进行了一些更改,然后单击“提交”。更新信息后,将再次返回EditProfile视图,但这次@Html.Action调用_EditUserInfo的HttpPost版本,再次更新用户信息,再次返回EditProfile视图,@Html.Action调用HttpPost版本_EditUserInfo ...你得到了它的发展方向。为什么在表单提交之后它会调用post版本而不是像初始访问EditProfile那样调用get版本?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我可能会对此有点不对,这是漫长的一天,但在EditProfile中,您将PartialToLoad(如果它为空)设置为"_EditUserInfo",然后在{{1}你再次将它设置为_EditUserInfo,这不会创建一个与你所经历的一样的循环吗?