Pro Asp.net mvc 2:示例中的问题

cou*_*011 1 asp.net-mvc razor asp.net-mvc-3

我试图从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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Menu.cshtml

@model IEnumerable<SStore.WebUI.Models.NavLink>

@foreach (var link in Model)
{
    Html.RouteLink(link.Text, link.RouteValues);
}
Run Code Online (Sandbox Code Playgroud)

如果我从母版页中删除此行,则服务器可以正常工作

@{
            Html.RenderAction("Menu", "Nav");
        }
Run Code Online (Sandbox Code Playgroud)

否则会收到此错误 在此输入图像描述

Dar*_*rov 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);
}
Run Code Online (Sandbox Code Playgroud)

让我解释:

您在本书中看到的示例是使用WebForms视图引擎.在此视图引擎中,您有.aspx(视图)和.ascx(部分).我想在他们使用的书中Menu.ascx,默认情况下没有掌握,因为它是部分的.

在剃刀中,不再有这样的区别.您只需拥有视图:.cshtml页面.您可以自行控制是否拥有主人.有不同的方式.一个是我之前展示的,另一个是return PartialView(navLinks)在儿童行动中.

  • @ coure06,是的但是在这个动作中你会返回一个视图.这个观点有一个主人.这个主人再次调用RenderAction到同一个动作,你明白了. (2认同)