递归ASP用户控件

本文关键字:控件 用户 ASP 递归 | 更新日期: 2023-09-27 17:59:56

我正在尝试为多级菜单制作一个用户控件。我已经创建了一级控件,它可以工作。它使用repeater进行迭代,并实例化我自己的MenuButton类。每个MenuButton对象都有相同类型的子对象。

问题是:如何在MenuButton.aspx文件中创建MenuButton控件?

我正在使用像这样的中继器

<%@ Control ClassName="MenuButton" Language="C#" AutoEventWireup="true" CodeBehind="MenuButton.ascx.cs"
    Inherits="MenuSolution._12.TEMPLATE.CONTROLTEMPLATES.MenuButton, MenuSolution, Version=1.0.0.0, Culture=neutral, PublicKeyToken=284eb573cd58385d" %>
<%@ Register TagPrefix="a" Namespace="MenuSolution._12.TEMPLATE.CONTROLTEMPLATES"
    Assembly="MenuSolution, Version=1.0.0.0, Culture=neutral, PublicKeyToken=284eb573cd58385d" %>
<li runat="server">
    <% if (Children.Count == 0)
       { %>
            <a href="<%# Url %>"><%# Description %></a>
    <% }
       else
       {
    %>
    <a href="<%# Url %>" class="dropdown-toggle" data-toggle="dropdown">
        <%# Description %><b class="caret"></b></a>
    <ul class="dropdown-menu multi-level">
        <asp:Repeater ID="repDynamicRows" runat="server">
            <ItemTemplate>
                <a:MenuButton runat="server" id="button" url='<%# DataBinder.Eval(Container.DataItem, "Url") %>'
                    children='<%# DataBinder.Eval(Container.DataItem, "ChildItems") %>' description='<%# DataBinder.Eval(Container.DataItem, "Description") %>' />
            </ItemTemplate>
        </asp:Repeater>
    </ul>
    <%
       }
    %>
</li>

并且该代码不会将MenuButton代码放置在最终HTML中。我试着注册这个控件,比如:

<%@ Register TagPrefix="a" TagName="MenuButton" Src="~/_controltemplates/MenuButton.ascx" %>

但这导致了循环参考。

我该怎么做?

递归ASP用户控件

您需要从代码而不是标记中加载控件。这是由于asp.net编译器如何根据您的标记创建程序集。

我做了以下更改以从代码后台加载控件。我还必须通过将#更改为=(并在控件上具有属性)来更改数据绑定。

控制菜单按钮.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MenuButton.ascx.cs" Inherits="WebApplication1.MenuButton" %>
<li id="Li1" runat="server">
    <% if (Children.Count == 0)
       { %>
            <a href="<%= Url %>"><%= Description %></a>
    <% }
       else
       {
    %>
    <a href="<%= Url %>" class="dropdown-toggle" data-toggle="dropdown">
        <%= Description %><b class="caret"></b></a>
    <!-- is now a server control -->
    <ul class="dropdown-menu multi-level" runat="server" ID="ul1">
       <!-- the page_load adds MenuButtons here -->       
    </ul>
    <%
       }
    %>
</li>

编码隐藏菜单按钮.ascx.cs

public partial class MenuButton : System.Web.UI.UserControl
{
    public String Url { get; set; }
    public string Description { get; set; }
    public List<MenuItem> Children { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Children != null)
        {
            foreach (var menuItem in Children)
            {
                // Create a button from the ascx file
                var but = (MenuButton)LoadControl("/MenuItems/MenuButton.ascx");
                // bind!
                but.Children = menuItem.Children;
                but.Description = menuItem.Description;
                but.Url = menuItem.Url;
                if (ul1 != null)
                {
                    // add our button
                    ul1.Controls.Add(but);
                }
            }
        }
    }
}

ViewModel

 public class MenuItem
 {
     public List<MenuItem> Children { get; set; }
     public String Url { get; set; }
     public string Description { get; set; }
 }