Pro Asp.net MVC 2: проблема в примере - PullRequest
1 голос
/ 02 марта 2011

Я пытаюсь воссоздать пример из главы 5 книги Pro Asp.net MVC2. Но как только я добавляю код меню сервера перестает работать. Есть проблемы с кодом?

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

1 Ответ

5 голосов
/ 02 марта 2011

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

Позвольте мне объяснить:

В примере, который вы видели в книге, использовался механизм просмотра WebForms. В этом механизме просмотра у вас есть .aspx (представления) и .ascx (частичные). Я предполагаю, что в книге они использовали Menu.ascx, который по умолчанию не имеет мастера, потому что он является частичным.

В Razor больше нет такого различия. У вас просто есть представления: .cshtml страниц. Вам решать, есть ли у них хозяин или нет. Есть разные способы. Один - это то, что я показал ранее, другой - это return PartialView(navLinks) внутри дочернего действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...