2011-03-02 37 views
1

我想重新创建一个例子,从书第Pro-Asp.net MVC2的第5章。但只要我添加菜单代码服务器停止工作。代码的任何问题?临Asp.net mvc 2:问题示例

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"); 
     } 

否则收到此错误 enter image description here

回答

5

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的书中,默认情况下它没有主人,因为它是一个部分。

在剃刀不再有这样的区别。您只需拥有views:.cshtml页面。控制他们是否有主人是由你决定的。有不同的方法。一个是我之前展示的,另一个是return PartialView(navLinks)里面的孩子动作。

+0

这是如何递归? Html.RenderAction只被调用一次。 – coure2011 2011-03-02 18:51:23

+2

@ coure06,是的,但在这个行动里面你回到了一个视图。这个观点有一个主人。这位大师再次调用RenderAction来执行相同的操作,这......你明白了。 – 2011-03-02 18:51:59

+0

这是一个亲错误。 LoL – foobar 2011-03-03 16:04:23