Я просмотрел кучу других сообщений об этом, но мой, кажется, ведет себя немного по-другому.Я возвращаю 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?
Спасибо за любую помощь!