【问题标题】:ASP.NET MVC3 Razor syntax help - I'm getting stuck in an infinite loopASP.NET MVC3 Razor 语法帮助 - 我陷入了无限循环
【发布时间】:2011-05-13 23:22:33
【问题描述】:

我正在尝试将小型 mvc2 应用程序转换为 mvc3 razor 语法。在我的 mvc2 应用程序中,我使用带有母版页的 aspx 视图引擎。按照 Steven Sanderson 的 Pro MVC2 书第 2 版中的示例,在母版页中,我调用了一个控制器操作,该操作为每个实体呈现部分视图。这工作正常。

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

我正在尝试使用 _layout.cshtml 和 razor。这就是我的问题所在。

 <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 在圣地亚哥

【问题讨论】:

  • 好问题,我在网上寻找同样的问题... PartialView 工作,但现在测试被打破了;(

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3 razor


【解决方案1】:

您没有发布实际的堆栈跟踪,但从描述中我猜您的递归是在运行布局页面的“部分”操作视图中,它呈现操作,呈现布局等。

尝试从您的子操作方法返回 PartialView 而不是 View。这将阻止执行 _ViewStart 页面,这将阻止为您的子操作呈现布局。更多关于这个的讨论在这里:http://forums.asp.net/t/1624687.aspx

【讨论】:

    【解决方案2】:

    @{
        Layout = string.Empty;
    } 
    

    在局部视图的顶部。

    【讨论】:

      【解决方案3】:

      首先,您的 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);
          }
      

      渲染

      文本
      controllerPerson
      actionPerson 家
      controllerPerson
      actionPerson
      personId1 卡利
      controllerPerson
      actionPerson
      personId2 标记

      【讨论】:

        【解决方案4】:

        尝试这样做(而不是 RenderAction)

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

        您的菜单视图中有什么?有什么可能导致递归吗?

        【讨论】:

          猜你喜欢
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 2015-10-03
          相关资源
          最近更新 更多