2010-11-22 70 views
11

我試圖將一個小的mvc2應用程序轉換爲mvc3剃刀語法。在我的mvc2應用程序中,我使用帶有母版頁的aspx視圖引擎。以Steven Sanderson的Pro MVC2書第二版爲例,在主頁中,我調用一個控制器動作,爲每個實體呈現局部視圖。這工作正常。ASP.NET MVC3 Razor語法幫助 - 我陷入了一個無限循環

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

任何幫助或提示,非常感謝。

感謝,
〜在聖地亞哥

+0

好問題,我在網上查找同樣的問題...部分視圖工作,但測試現在打破;( – 2011-01-28 17:55:57

回答

22

你沒有發佈實際的堆棧跟蹤,但從描述我猜你的遞歸是在'部分'操作視圖中運行佈局頁面,它呈現的動作,它呈現佈局等。

嘗試從您的兒童行爲方法而不是View返回PartialView。這將阻止_ViewStart頁面被執行,這將阻止爲您的子操作呈現佈局。關於這方面更多的討論是在這裏:http://forums.asp.net/t/1624687.aspx

1

首先所有PERSONID參數的CK是從來沒有使用過(是否正確路由呢)?

,但我肯定會看在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); 
    } 

呈現

文本
controllerPerson
actionPerson 首頁
controllerPerson
actionPerson
personId1 卡利
controllerPerson
actionPerson
personId2 標記
+0

+1爲明顯的工作,儘管它是TL;博士:) – 2010-12-07 22:25:24

1

嘗試這樣做只是(而不是的RenderAction)這個

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

什麼是在你的菜單視圖?有什麼可能導致遞歸嗎?

3

@{ 
    Layout = string.Empty; 
} 

在你的局部視圖頂部。