我看了一堆其他报告这个,但我的行为有点不同。我为我的子操作返回PartialViewResults,因此这不是递归的来源。这是我所拥有的一个愚蠢的版本。MVC 3 StackOverflowException瓦特/ @ Html.Action()
// 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视图,并调用_EditUserInfo的HttpPost版本。正在发生。为什么在提交表单后它会调用post版本,而不是像EditProfile的初始访问那样获取版本?
感谢您的帮助!