我正在尝试重新创建Pro Asp.net MVC2一书的第5章中的示例。但是一旦我添加菜单代码服务器就停止工作。代码有问题吗?
public class NavController : Controller
{
private IProductRepository productsRepository;
public NavController(IProductRepository productsRepository)
{
this.productsRepository = productsRepository;
}
public ViewResult Menu()
{
Func<string, NavLink> makeLink = categoryName => new NavLink
{
Text = categoryName ?? "Home",
RouteValues = new RouteValueDictionary( new {
controller = "Products", action = "List", category = categoryName, page = 1
})
};
List<NavLink> navLinks = new List<NavLink>();
navLinks.Add(makeLink(null));
var categories = productsRepository.Products.Select(x => x.Category);
foreach (string categoryName in categories.Distinct().OrderBy(x => x))
navLinks.Add(makeLink(categoryName));
return View(navLinks);
}
}
Menu.cshtml
@model IEnumerable<SStore.WebUI.Models.NavLink>
@foreach (var link in Model)
{
Html.RouteLink(link.Text, link.RouteValues);
}
如果我从母版页中删除此行,则服务器可以正常工作
@{
Html.RenderAction("Menu", "Nav");
}
否则会收到此错误
答案 0 :(得分:5)
Html.RenderAction("Menu", "Nav");
:这是一个可怕的递归:Nav/Menu
呈现Nav/Menu
呈现Nav/Menu
,...,直到你的堆栈耗尽并且你的网络服务器崩溃: - )
当你渲染这样的子动作时,确保它没有主人或者主人会一次又一次地重新渲染它......所以修改这个视图(~/Views/Nav/Menu.cshtml
)就像这样:
@model IEnumerable<SStore.WebUI.Models.NavLink>
@{
Layout = null;
}
@foreach (var link in Model)
{
Html.RouteLink(link.Text, link.RouteValues);
}
让我解释一下:
您在本书中看到的示例是使用WebForms视图引擎。在此视图引擎中,您有.aspx
(视图)和.ascx
(部分)。我想在书中他们使用的是Menu.ascx
,默认情况下它没有主人,因为它是部分的。
在剃刀中不再有这样的区别。您只需拥有视图:.cshtml页面。您可以自行控制是否拥有主人。有不同的方式。一个是我之前展示的,另一个是return PartialView(navLinks)
在儿童行动中。