ASP.NET MVC3剃刀语法帮助 - 我陷入无限循环
-
27-09-2019 - |
题
我想转换一个小MVC2应用到MVC3剃刀语法。在我的MVC2应用我使用的是母版页的ASPX视图引擎。继从史蒂芬·桑德森的Pro MVC2书第二版的例子,在母版我叫呈现为每个实体的局部视图控制器动作。这是正常工作。
<div id="categories">
<% Html.RenderAction("Menu", "Nav"); %>
</div>
使用_layout.cshtml和剃刀我想这一点。这里是我的问题的用武之地。
<div id="categories">
@{
Html.RenderAction("Menu", "Nav");
}
</div>
这是现在导致一个无限循环和我得到奇怪的是一个StackOverflowException。任何人都可以帮我解决这个问题呢?这里是控制器的方法的代码。
public ViewResult Menu(string personId)
{
Func<string, NavLink> makeLink = pId => new NavLink
{
Text = pId ?? "Home"
, RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person"})
};
List<NavLink> navLinks = new List<NavLink> {makeLink(null)};
Func<Person, NavLink> makeLink2 = p => new NavLink
{
Text = p.Name ?? "Home"
, RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })
};
var people = usersRepository.People.OrderBy(x => x.Name);
var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);
navLinks.AddRange(peopleLinks);
return View("_menu", navLinks);
}
任何帮助或提示最理解。
谢谢,结果 〜CK在圣地亚哥
解决方案
您没有发布实际的堆栈跟踪,但我猜你的recurssion描述是在运行的页面布局,这使得动作,这使得布局等方面的“部分”动作视图。
尝试从孩子的行动方法,而不是一个PartialView
返回View
。这将防止_ViewStart页面被执行,这将阻止布局被渲染为您的孩子的行动。关于这方面更多的讨论是在这里: http://forums.asp.net/t/1624687.aspx
其他提示
把
@{
Layout = string.Empty;
}
在你的局部视图顶部。
首先你PERSONID参数从来没有使用过(它是正确地路由呢)?
但我肯定会看在EnumerableHelpers.MakeLinks启动 它是一个递归问题隐藏尝试设置一个断点最好的地方有
,因为从我使用什么
型号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MvcApplication1.Controllers
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class EnumerableHelpers
{
internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
{
var retVal = new List<NavLink> ();
foreach (var item in people)
{
retVal.Add(makeLink2(item));
}
return retVal;
}
}
public class usersRepository
{
private static List<Person> people = new List<Person>();
public usersRepository()
{
}
public static List<Person> People
{
get
{
people = new List<Person>() {
new Person() { Id = 1, Name = "carley" },
new Person() { Id = 2, Name = "mark" },
};
return people;
}
set
{
people = value;
}
}
}
public class NavLink
{
public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
public string Text { get; set; }
}
}
查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MvcApplication1.Controllers
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class EnumerableHelpers
{
internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
{
var retVal = new List<NavLink> ();
foreach (var item in people)
{
retVal.Add(makeLink2(item));
}
return retVal;
}
}
public class usersRepository
{
private static List<Person> people = new List<Person>();
public usersRepository()
{
}
public static List<Person> People
{
get
{
people = new List<Person>() {
new Person() { Id = 1, Name = "carley" },
new Person() { Id = 2, Name = "mark" },
};
return people;
}
set
{
people = value;
}
}
}
public class NavLink
{
public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
public string Text { get; set; }
}
}
控制器
public ViewResult Menu(string id)
{
Func<string, NavLink> makeLink = pId => new NavLink
{
Text = pId ?? "Home"
,
RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person" })
};
List<NavLink> navLinks = new List<NavLink> { makeLink(null) };
Func<Person, NavLink> makeLink2 = p => new NavLink
{
Text = p.Name ?? "Home"
,
RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })
};
var people = usersRepository.People.OrderBy(x => x.Name);
var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);
navLinks.AddRange(peopleLinks);
return View(navLinks);
}
呈现
文本 结果controllerPerson结果actionPerson 家 结果controllerPerson结果actionPerson点击personId1 卡利 结果controllerPerson结果actionPerson点击personId2 标记尝试这样做只是(代替的RenderAction)这
@Html.Action("Menu", "Nav")
什么是在你的菜单视图?是可能会造成有什么递归?
不隶属于 StackOverflow