Pregunta

Estoy tratando de convertir una pequeña aplicación MVC2 a la sintaxis MVC3 de afeitar. En mi solicitud MVC2 estoy usando la vista del motor aspx con una página maestra. Siguiendo el ejemplo del libro Pro MVC2 2ª edición de Steven Sanderson, en el masterpage que llamo una acción del controlador, que muestra una vista parcial para cada entidad. Esto está funcionando correctamente.

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

usando _layout.cshtml y la maquinilla de afeitar que estoy tratando esto. Aquí es donde entra en juego mi problema.

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

    }
</div>

Esto está causando un bucle infinito y ahora me estoy poniendo por extraño que parezca un StackOverflowException. ¿Puede alguien me ayuda corregir el problema? Aquí está el código método controlador.

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

Cualquier ayuda o consejos es muy apreciada.

Gracias,
~ Ck en San Diego

¿Fue útil?

Solución

no le envió el seguimiento de pila real, pero a partir de la descripción que supongo que su recurssion está en la vista de la acción 'parcial' de ejecutar el diseño de la página, lo que hace que la acción, lo que hace que el diseño, etc.

Trate de devolver un PartialView de su método de acción hijo en lugar de un View. Esto evitará que la página _ViewStart de ser ejecutado, lo que impide la disposición de que se queden para su acción hijo. Más discusión acerca de esto está aquí: http://forums.asp.net/t/1624687.aspx

Otros consejos

put

@{
    Layout = string.Empty;
} 

en la parte superior de la vista parcial.

en primer lugar su personId parámetro no se usa nunca (es pasado correctamente todos modos)?

Pero sin duda empezar por mirar en los EnumerableHelpers.MakeLinks es el mejor lugar para un problema de recursividad para ocultar Pruebe a establecer un punto de interrupción no

a causa de lo que solía

Modelo:

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

Ver

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

Controller

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

rindió

                                   Texto                                             
controllerPerson
actionPerson                      Hogar                                             
controllerPerson
actionPerson
personId1                      Carley                                             
controllerPerson
actionPerson
personId2                      marca

Trate de hacer precisamente esto (en lugar de RenderAction)

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

¿Qué hay en la vista del menú? ¿Hay algo que podría estar causando una recursión?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top