2011-03-02 83 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