代码之家  ›  专栏  ›  技术社区  ›  slolife

如何创建使用ASP:ListItem列表作为子控件的ASP.NET用户/服务器控件?

  •  9
  • slolife  · 技术社区  · 16 年前

    我希望创建一个用户/服务器控件,该控件将使用如下内容创建:

    <my:MyListControl runat="server">
       <asp:ListItem Text="Test1" Value="Test1" />
       <asp:ListItem Text="Test2" Value="Test2" />
    </my:MyListControl>
    

    我只是想从这里开始: 物品或代码样本。

    我应该从哪个基类继承?要覆盖什么?

    可能是如何自定义控件接受的子项(my:listeitem而不是asp:listeitem)。

    我要做的是为我的站点的一小部分创建一个非常简单的面包屑控件。我已经使用了所有常用的ASP.NET控件,但这些项都是用代码添加的,这意味着修复拼写错误或格式错误需要重新编译,这并不理想。

    编辑:

    下面是我的代码以及Josh的建议:

    命名空间mysite.controls 部分类面包屑 继承用户控件

        Private m_BreadCrumbs As New List(Of BreadCrumbItem)
    
        <PersistenceMode(PersistenceMode.InnerProperty)> _
        Public Property Items() As List(Of BreadCrumbItem)
            Get
                Return m_BreadCrumbs
            End Get
            Set(ByVal value As List(Of BreadCrumbItem))
                m_BreadCrumbs = value
            End Set
        End Property
    
        Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
            Bind()
        End Sub
    
        Private Sub Bind()
            lvCrumbs.DataSource = Items
            Me.DataBind()
        End Sub
    End Class
    
    Public Class BreadCrumbItem
        Private m_Text As String
        Public Property Text() As String
            Get
                Return m_Text
            End Get
            Set(ByVal value As String)
                m_Text = value
            End Set
        End Property
    
        Private m_Url As String
        Public Property Url() As String
            Get
                Return m_Url
            End Get
            Set(ByVal value As String)
                m_Url = value
            End Set
        End Property
    End Class
    

    结束命名空间

    然后我的页面代码如下:

    <%@ Page Language="VB" AutoEventWireup="false" Inherits="MySite.MyPage" Title="My Page" Codebehind="MyPage.aspx.vb" %>
    <%@ Register TagPrefix="my" Namespace="MySite.Controls" Assembly="MySite" %>
    <my:BreadCrumbs ID="breadcrumbs" runat="server">
        <Items>
            <my:BreadCrumbItem Text="Another page" Url="AnotherPage.aspx" />
        </Items>
    </my:BreadCrumbs>
    
    2 回复  |  直到 14 年前
        1
  •  11
  •   JoshBerke    16 年前

    可以在用户控件的代码后面添加属性,例如:

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public List<ListItem> Items
    {
        get;
        set;
    }
    

    然后您的标记将是:

    <my:MyListControl runat="server">
      <Items>
        <asp:ListItem/>
      </Items>
    </my:myListControl>
    

    为了使它成为您自己的列表项(我建议您这样做,而不是使用ASP.NET。)您需要创建自己的类。

    下面是我使用的服务器控件的一个示例(我删除了很多噪声,因此这只是一个框架):

       [ToolboxData("<{0}:Menubar runat=server></{0}:Menubar>")]
        [System.ComponentModel.DesignTimeVisible(false)]
        public class Menubar : WebControl, IPostBackEventHandler
        {
    
            private List<MenuItem> _menuItems = new List<MenuItem>();
            [PersistenceMode(PersistenceMode.InnerProperty)]
            public List<MenuItem> MenuItems
            {
                get
                {
                    return _menuItems;
                }
            }
    
        }
        [ToolboxItem(false)]
        [ParseChildren(true, "MenuItems")]
        public class MenuItem
        {
            private string _clientClick;
            private List<MenuItem> _menuItems = new List<MenuItem>();
    
            [Localizable(true)]
            public string Title { get; set; }
            public string Href { get; set; }
            public string Id { get; set; }
            [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
            public List<MenuItem> MenuItems
            {
                get { return _menuItems; }
                set { _menuItems = value; }
            }
        }
    

    现在我可以这样使用:

    <my:Menubar runat="server" ID="menuBar">
        <MenuItems>
            <my:MenuItem Title="Save" Href="javascript:saveItem(this);"  />
            <my:MenuItem Title="Print" Href="javascript:void(0);">
                <MenuItems>
                    <my:MenuItem Title="Preview" Href=""/>
                    <my:MenuItem Title="To Pdf" Href="javascript:"/>
                </MenuItems>
            </my:MenuItem>
        </MenuItems>
    </my:Menubar>
    
        2
  •  0
  •   Alan Jackson    16 年前

    使用asp:repeater,然后将其绑定到面包屑中所需的对象列表。您可以使用模板自定义项目本身和分隔符。

    推荐文章