[英]Pro Asp.net mvc 2: Problem in example
我正在嘗試從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");
}
否則出現此錯誤
Html.RenderAction("Menu", "Nav");
:這是可怕的遞歸: Nav/Menu
呈現Nav/Menu
呈現Nav/Menu
...,直到耗盡堆棧並且Web服務器崩潰為止:-)
當您渲染這樣的子動作時,請確保它沒有主控器,或者主控器會一次又一次地重新渲染它,....因此,請像以下那樣修改此視圖( ~/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
,默認情況下它沒有母版,因為它是部分母版。
在Razor中不再有這種區別。 您只擁有視圖:.cshtml頁面。 由您決定是否擁有主控。 有不同的方法。 一個是我之前顯示的內容,另一個是在子操作中return PartialView(navLinks)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.