ASP.NET MVC Razor中@helper方法的递归调用,在执行过程中会跳过@helper方法内部的代码

本文关键字:方法 @helper 过程中 执行 代码 内部 调用 MVC NET Razor ASP | 更新日期: 2023-09-27 18:27:10

我正在尝试使用@functions&ASP.NET MVC Razor中的助手功能。

我使用@functions成功地创建了嵌套列表,但当我尝试使用@helper方法创建嵌套列表时,执行不会进入helper方法内部。

型号:

public class NavigationMenuModels
    {
        public int ID { get; set; }
        public int? ParentID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public List<NavigationMenuModels> SubNavigationMenu { get; set; }
    }

视图模型:

public class NavigationMenuViewModel
    {
        public NavigationMenuViewModel()
        {
            ListMenu = new List<NavigationMenuModels>();
        }
        public string ListName { get; set; }
        public List<NavigationMenuModels> ListMenu { get; set; }
    }

控制器:

public ActionResult NavigationMenu()
        {
            //Menu
            NavigationMenuModels objMenu = new NavigationMenuModels() { ID = 1, ParentID = null, Name = "Menu", Description = "Menu" };
            //Menu Items
            List<NavigationMenuModels> objMenuItems = new List<NavigationMenuModels>();
            objMenuItems.Add(new NavigationMenuModels() { ID = 1, ParentID = 1, Name = "Home", Description = "Home" });
            objMenuItems.Add(new NavigationMenuModels() { ID = 2, ParentID = 1, Name = "About", Description = "About" });
            objMenuItems.Add(new NavigationMenuModels() { ID = 3, ParentID = 1, Name = "Help", Description = "Help" });
            objMenuItems.Add(new NavigationMenuModels() { ID = 4, ParentID = 1, Name = "Contact", Description = "Contact" });
            objMenu.SubNavigationMenu = objMenuItems;
            //Admin
            NavigationMenuModels objAdmin = new NavigationMenuModels() { ID = 2, ParentID = null, Name = "Admin", Description = "Admin" };
            //Admin Items
            List<NavigationMenuModels> objAdminItems = new List<NavigationMenuModels>();
            objAdminItems.Add(new NavigationMenuModels() { ID = 1, ParentID=2, Name = "User Permissions", Description = "User Permissions" });
            objAdminItems.Add(new NavigationMenuModels() { ID = 2, ParentID=2, Name = "Security", Description = "Security" });
            objAdmin.SubNavigationMenu = objAdminItems;
            //Account
            NavigationMenuModels objAccount = new NavigationMenuModels() { ID = 3, ParentID = null, Name = "Account", Description = "Account" };
            //Account Items
            List<NavigationMenuModels> objAccountItems = new List<NavigationMenuModels>();
            objAccountItems = null;
            objAccount.SubNavigationMenu = objAccountItems;
            NavigationMenuViewModel objNavigationMenu = new NavigationMenuViewModel();
            objNavigationMenu.ListName = "Master Navigation";
            objNavigationMenu.ListMenu.Add(objMenu);
            objNavigationMenu.ListMenu.Add(objAdmin);
            objNavigationMenu.ListMenu.Add(objAccount);
            return View(objNavigationMenu);
        }

CSHTML:

@using LearnAngularJs_App1.Models
@using System.Text
@model LearnAngularJs_App1.Models.NavigationMenuViewModel
@{
    ViewBag.Title = "NavigationMenu";
}
@functions
{
        public static HtmlString GetNestedListHtml(NavigationMenuViewModel Crudeinput)
        {
            StringBuilder sb = new StringBuilder();
            var orderedList = new TagBuilder("ol");
            foreach (NavigationMenuModels NavMenu in Crudeinput.ListMenu)
            {
                var listItem = new TagBuilder("li");
                listItem.SetInnerText(NavMenu.Name);
                sb.AppendLine(listItem.ToString(TagRenderMode.Normal));
                if (NavMenu.SubNavigationMenu != null)
                {
                    if (NavMenu.SubNavigationMenu.Count > 0)
                    {
                        sb.AppendLine(BuildNestedList(NavMenu.SubNavigationMenu));
                    }
                }
            }
            orderedList.InnerHtml = sb.ToString();
            return new HtmlString(orderedList.ToString(TagRenderMode.Normal));
        }
        public static string BuildNestedList(List<NavigationMenuModels> SubMenuList)
        {
            var sb = new StringBuilder();
            var orderedList = new TagBuilder("ol");
            if (SubMenuList.Count > 0)
            {
                foreach (NavigationMenuModels SubNavgationMenuitem in SubMenuList)
                {
                    var listItem = new TagBuilder("li");
                    listItem.SetInnerText(SubNavgationMenuitem.Name);
                    sb.AppendLine(listItem.ToString(TagRenderMode.Normal));
                    if (SubNavgationMenuitem.SubNavigationMenu != null)
                    {
                        if (SubNavgationMenuitem.SubNavigationMenu.Count > 0)
                        {
                            sb.AppendLine(BuildNestedList(SubNavgationMenuitem.SubNavigationMenu));
                        }
                    }
                }
            }
            orderedList.InnerHtml = sb.ToString();
            return orderedList.ToString(TagRenderMode.Normal);
        }
}
@helper BuildNestedListHelper(List<NavigationMenuModels> Crudeinput)
{
    if (Crudeinput.Any())
    {
        <ol>
            @foreach (NavigationMenuModels NavMenu in Crudeinput)
            {
                <li>
                    @NavMenu.Name
                    @if (NavMenu.SubNavigationMenu != null)
                    {
                        BuildNestedListHelper(NavMenu.SubNavigationMenu);
                    }
                </li>
            }
        </ol>
    }
}
<h2>NavigationMenu</h2>
<div>
    <div><span>Bind Navigation Menu using razor @@funtions</span></div>
    <div>
        @GetNestedListHtml(Model)
    </div>
</div>
<div>
    <div><span>Bind Navigation Menu using razor @@helper</span></div>
    <div>
        @BuildNestedListHelper(Model.ListMenu)
    </div>
</div>

当对helper方法进行递归调用时,将执行该方法,但跳过执行。

ASP.NET MVC Razor中@helper方法的递归调用,在执行过程中会跳过@helper方法内部的代码

递归调用时只需在方法前面添加"@"即可。