2011-03-02 2 views
1

Pro Asp.net MVC2 책의 Chapter-5에서 예제를 다시 만들려고합니다. 하지만 곧 메뉴 코드 서버를 추가하면 작동이 멈 춥니 다. 코드에 문제가 있습니까?Pro 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를 렌더링..., 당신은 스택에서 실행하고 렌더링 할 때 웹 서버가 :-)

불면 때까지이 같은 아이의 행동이 더 마스터 또는 다시 쓰게 마스터거야 다시이 없는지 확인 다시 다시, .... 그래서 이런이보기 ( ~/Views/Nav/Menu.cshtml)를 수정 :

@model IEnumerable<SStore.WebUI.Models.NavLink> 
@{ 
    Layout = null; 
} 

@foreach (var link in Model) 
{ 
    Html.RouteLink(link.Text, link.RouteValues); 
} 

가 설명해 드리죠 :이 책에서 본

예는 웹폼 엔진을 볼 사용했다. 이 뷰 엔진에는 .aspx (조회수) 및 .ascx (부분)이 있습니다. 나는이 책에서 Menu.ascx을 사용하고 있는데, 이는 부분적으로 마스터가 없기 때문입니다.

면도기에서는 더 이상 그런 구별이 없습니다. 단순히보기가 있습니다 : .cshtml 페이지. 그들이 마스터인지 아닌지를 제어하는 ​​것은 당신에게 달려 있습니다. 다른 방법이 있습니다. 하나는 이전에 보여준 것이고, 다른 하나는 return PartialView(navLinks)의 자식 동작입니다.

+0

어떻게 재귀입니까? Html.RenderAction은 한 번만 호출됩니다. – coure2011

+2

@ coure06 네,하지만이 행동 안에는 당신이보기를 돌려줍니다. 이 뷰에는 마스터가 있습니다. 이 주인은 RenderAction을 다시 같은 액션으로 호출합니다. –

+0

이것은 프로 오류입니다. LoL – foobar