Справка по синтаксису Razor в ASP.NET MVC3 - я застреваю в бесконечном цикле - PullRequest
11 голосов
/ 22 ноября 2010

Я пытаюсь преобразовать небольшое приложение mvc2 в синтаксис mvc3. В моем приложении mvc2 я использую aspx view engine с главной страницей. Следуя примеру из книги Стивена Сандерсона Pro MVC2, 2-е издание, на главной странице я называю действие контроллера, которое отображает частичное представление для каждого объекта. Это работает правильно.

 <div id="categories">
    <% Html.RenderAction("Menu", "Nav"); %>
</div>

используя _layout.cshtml и бритву, я пытаюсь это сделать. Здесь моя проблема.

 <div id="categories">
    @{ 
        Html.RenderAction("Menu", "Nav"); 

    }
</div>

Это вызывает бесконечный цикл, и я получаю довольно странное исключение StackOverflowException. Может кто-нибудь помочь мне исправить проблему? Вот код метода контроллера.

  public ViewResult Menu(string personId)
    {
        Func<string, NavLink> makeLink = pId => new NavLink
        {
            Text = pId ?? "Home"
            , RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person"})

        };

        List<NavLink> navLinks = new List<NavLink> {makeLink(null)};


        Func<Person, NavLink> makeLink2 = p => new NavLink
        {
            Text = p.Name ?? "Home"
            , RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })

        };

        var people = usersRepository.People.OrderBy(x => x.Name);
        var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);

        navLinks.AddRange(peopleLinks);

        return View("_menu", navLinks);
    }

Любая помощь или советы приветствуются.

Спасибо
~ ck в Сан-Диего

Ответы [ 4 ]

23 голосов
/ 22 ноября 2010

Вы не опубликовали фактическую трассировку стека, но из описания я предполагаю, что ваша рекурсия находится в «частичном» представлении действия, выполняющем страницу макета, которое отображает действие, которое отображает макет и т. Д. *

Попробуйте вернуть PartialView из вашего дочернего метода действия вместо View. Это предотвратит выполнение страницы _ViewStart, что предотвратит отображение макета для вашего дочернего действия. Подробнее об этом здесь: http://forums.asp.net/t/1624687.aspx

3 голосов
/ 30 мая 2011

положить

@{
    Layout = string.Empty;
} 

поверх вашего частичного просмотра.

1 голос
/ 22 ноября 2010

Попробуйте сделать это (вместо RenderAction)

@Html.Action("Menu", "Nav")

Что находится в вашем меню? Есть ли что-нибудь, что может вызвать рекурсию?

1 голос
/ 22 ноября 2010

прежде всего ваш параметр personId никогда не используется (все равно правильно ли он маршрутизируется)?

но я бы определенно начал с поиска в EnumerableHelpers.MakeLinks это лучшее место, где можно скрыть проблему рекурсии, попробуйте установить точку останова там

потому что из того, что я использовал

Модель:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MvcApplication1.Controllers
{
    public class Person
    {
    public int Id { get; set; }
    public string Name { get; set; }
}
public class EnumerableHelpers
{

    internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
    {
      var retVal = new List<NavLink>  ();
      foreach (var item in people)
      {
          retVal.Add(makeLink2(item));
      }
      return retVal;
    }
}
public class usersRepository
{
    private static List<Person> people = new List<Person>();
    public usersRepository()
    {


    }
    public static List<Person> People
    {
        get
        {
            people = new List<Person>()  {
                 new Person() { Id = 1,  Name = "carley" },
                 new Person() { Id = 2,  Name = "mark" },
             };
            return people;
        }
        set
        {
            people = value;
        }
    }


}

public class NavLink
{
    public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
    public string Text { get; set; }
}
}

Просмотр

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MvcApplication1.Controllers
    {
        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
        public class EnumerableHelpers
        {

            internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
            {
              var retVal = new List<NavLink>  ();
              foreach (var item in people)
              {
                  retVal.Add(makeLink2(item));
              }
              return retVal;
            }
        }
        public class usersRepository
        {
            private static List<Person> people = new List<Person>();
            public usersRepository()
            {


            }
            public static List<Person> People
            {
                get
                {
                    people = new List<Person>()  {
                         new Person() { Id = 1,  Name = "carley" },
                         new Person() { Id = 2,  Name = "mark" },
                     };
                    return people;
                }
                set
                {
                    people = value;
                }
            }


        }

        public class NavLink
        {
            public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
            public string Text { get; set; }
        }
    }

Контроллер

public ViewResult Menu(string id)
     {
        Func<string, NavLink> makeLink = pId => new NavLink
        {
            Text = pId ?? "Home"
            ,
            RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person" })

        };

        List<NavLink> navLinks = new List<NavLink> { makeLink(null) };


        Func<Person, NavLink> makeLink2 = p => new NavLink
        {
            Text = p.Name ?? "Home"
            ,
            RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })

        };

        var people = usersRepository.People.OrderBy(x => x.Name);
        var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);

        navLinks.AddRange(peopleLinks);

        return View(navLinks);
    }

* 1016 визуализации * Текст
controllerPerson
actionPerson Главная
controllerPerson
actionPerson
personId1 Карли
controllerPerson
actionPerson
personId2 отметка

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