ASP.NET MVC3 مساعدة بناء جملة Razor - أنا عالق في حلقة لا نهائية

StackOverflow https://stackoverflow.com/questions/4247950

سؤال

أحاول تحويل تطبيق MVC2 صغير إلى بناء جملة MVC3 Razor. في تطبيق MVC2 الخاص بي ، أستخدم محرك عرض ASPX مع صفحة رئيسية. باتباع المثال من كتاب Steven Sanderson's Pro MVC2 ، الطبعة الثانية ، في Masterpage ، أسمي إجراء وحدة تحكم يجعل عرضًا جزئيًا لكل كيان. هذا يعمل بشكل صحيح.

 <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 من طريقة عمل طفلك بدلاً من أ View. سيمنع هذا من تنفيذ صفحة _ViewStart التي ستمنع التخطيط من تقديمه لصالح طفلك. المزيد من النقاش حول هذا هنا: http://forums.asp.net/t/1624687.aspx

نصائح أخرى

وضع

@{
    Layout = string.Empty;
} 

في الجزء العلوي من وجهة نظرك الجزئية.

بادئ ذي بدء ، لا يتم استخدام المعلمة الشخصية الخاصة بك أبدًا (هل يتم توجيهها بشكل صحيح على أي حال)؟

لكنني بالتأكيد سأبدأ بالبحث في 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);
    }

المقدمة

نص
وحدة التحكم
Actionperson Home
وحدة التحكم
Actionperson
personid1 كارلي
وحدة التحكم
Actionperson
markid2 علامة

حاول القيام بذلك فقط (بدلاً من RenderAction)

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

ماذا يوجد في عرض القائم الخاص بك؟ هل هناك أي شيء يمكن أن يسبب عودة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top