2010-11-22 14 views
11

Estoy tratando de convertir una pequeña aplicación mvc2 a la sintaxis de la máquina de afeitar mvc3. En mi aplicación mvc2 estoy usando el motor de vista aspx con una página maestra. Siguiendo el ejemplo del libro Pro MVC2 de Steven Sanderson, segunda edición, en la página maestra llamo una acción de controlador que representa una vista parcial para cada entidad. Esto está funcionando correctamente.Ayuda de sintaxis ASP.NET MVC3 Razor - Me estoy atascado en un bucle infinito

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

usando _layout.cshtml and razor Estoy intentando 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. ¿Alguien puede ayudarme a corregir el problema? Aquí está el código del método del 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 sugerencia es muy apreciada.

Gracias,
~ ck en San Diego

+0

Buena pregunta, estaba buscando en internet el mismo problema ... PartialView funciona pero las pruebas están rotas ahora; ( –

Respuesta

22

No ha publicado el seguimiento de pila real, pero de la descripción supongo que su recursión está en la vista de acción 'parcial' que ejecuta la página de diseño, que representa la acción, que representa el diseño, etc.

Intente devolver PartialView desde el método de acción de su hijo en lugar de View. Esto evitará que se ejecute la página _ViewStart, lo que evitará que el diseño se represente para su acción secundaria. Más discusión acerca de esto está aquí: http://forums.asp.net/t/1624687.aspx

1

en primer lugar el parámetro personId nunca se utiliza (se encamina correctamente que de todos modos)?

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

porque a partir 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; } 
     } 
    } 

controlador

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

rendido

texto
controllerPerson
actionPerson Inicio
controllerPerson
actionPerson
personId1 carley
controllerPerson
actionPerson
personId2 marca
+0

+1 por trabajo obvio a pesar de ser tl; dr :) –

1

Intenta hacer precisamente esto (en lugar de RenderAction)

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

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

3

poner

@{ 
    Layout = string.Empty; 
} 

en la parte superior de la vista parcial.