0

我看了一堆其他报告这个,但我的行为有点不同。我为我的子操作返回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的初始访问那样获取版本?

感谢您的帮助!

回答

0

我可能会得到这个有点不对劲,这是一个漫长的日子,所以,但在EditProfile设置PartialToLoad(如果它是空的),以"_EditUserInfo",然后在_EditUserInfo您再次将其设置为_EditUserInfo,不会在创建循环表现得如同你正在经历的那样?