从XML加载动态菜单我试图把一个动态菜单(从XML负载)在我的布局,但我在PartialController.cs/MainMenu的()ASP.NET MVC StackOverflowException在布局
我有一个StackOverflowException不明白为什么我的代码抛出一个StackOverflowException,因为我没有一个循环(或者我没有看到它!)。
Layout.cshtml:
....
<div id="menu">
@if (Request.IsAuthenticated)
{
Html.RenderAction("MainMenu", "Partial");
}
</div>
....
MainMenu.cshtml:
PartialController.cs:
[ChildActionOnly]
public ActionResult MainMenu()
{
var menu = new Menu { Nodes = new List<NodeMenu>() };
var xmlData = System.Web.HttpContext.Current.Server.MapPath("~/Content/navigation.xml");
if (xmlData == null)
{
throw new ArgumentNullException("xmlData");
}
var xmldoc = new XmlDataDocument();
var fs = new FileStream(xmlData, FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);
var xmlnode = xmldoc.GetElementsByTagName("node");
for (var i = 0; i <= xmlnode.Count - 1; i++)
{
var xmlAttributeCollection = xmlnode[i].Attributes;
if (xmlAttributeCollection != null)
{
var nodeMenu = new NodeMenu { Name = xmlAttributeCollection["title"].Value, Links = new List<LinkMenu>() };
if (xmlnode[i].ChildNodes.Count != 0)
{
for (var j = 0; j < xmlnode[i].ChildNodes.Count; j++)
{
var linkMenu = new LinkMenu();
var xmlNode = xmlnode[i].ChildNodes.Item(j);
if (xmlNode != null)
{
if (xmlNode.Attributes != null)
{
linkMenu.Name = xmlNode.Attributes["title"].Value;
linkMenu.Action = xmlNode.Attributes["action"].Value;
linkMenu.Controller = xmlNode.Attributes["controller"].Value;
linkMenu.Key = xmlNode.Attributes["key"].Value;
nodeMenu.Links.Add(linkMenu);
}
}
}
}
menu.Nodes.Add(nodeMenu);
}
}
return View(menu);
}
navigation.xml:
<nodes>
<node title="User Management">
<link title="Create User" action="CreateUser" controller="UserManagement" key="UM_CREATEUSER" />
<link title="Users List" action="UsersList" controller="UserManagement" key="UM_USERSLIST" />
<link title="Import Users" action="ImportUsers" controller="UserManagement" key="UM_IMPORTUSERS" />
</node>
</nodes>
编辑: 这是异常的细节(有没有堆栈跟踪):
System.StackOverflowException了未处理 类型的未处理的异常 'System.StackOverflowException' 出现在mscorlib.dll
{因为当前线程堆栈溢出状态无法计算表达式。}
调用堆栈,我看行“Html.RenderAction( “MainMenu”,“部分”);“不断地打电话,但我不知道为什么。
你是什么意思,我在这段代码中看到3个循环。 1'foreach'循环和2'for'循环。如果您可以从溢出异常中添加堆栈跟踪,这可能有助于缩小堆栈溢出的位置。 – danludwig 2014-12-04 15:49:47
您可以尝试使用LINQ表达式来获取选定节点而不是循环的列表(如果需要帮助,请告诉我)。附注:最后在'stackoverflow.com'上看到了'stackoverflow exception' :)。 – 2014-12-04 15:54:19
当我说“我没有看到一个循环”时,我的意思是我没有看到递归循环。我知道我有3个循环,但stackoverflow异常不在这些循环中。多次调用MainMenu()方法。我会把堆栈跟踪放在main中。 – 2014-12-05 08:24:19