如何创建使用ASP清单ASP.NET用户/服务器控件:列表项的子控件? [英] How to create ASP.NET user/server control that uses a list of asp:ListItem as child controls?

查看:95
本文介绍了如何创建使用ASP清单ASP.NET用户/服务器控件:列表项的子控件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我期待创建将与类似下面创建一个用户/服务器控件:

 <我:MyListControl =服务器>
   < ASP:ListItem的文本=Test1的VALUE =测试1/>
   < ASP:ListItem的文本=Test2的VALUE =Test2的/>
< /我:MyListControl>

我只是想找一个在这里开始:
文章或code样品。

我应该继承什么基类?怎么覆盖?

可能如何自定义哪些子项目我的控制接受(我:列表项,而不是ASP:列表项)

我所希望做的是创造我的网站的一小部分非常简单的面包屑的控制。我把它全部用股票ASP.NET控件的工作,但项目是在code,这意味着固定一个拼写错误或格式错误涉及重新编译,这是不理想的补充。

修改

下面是我的code与另外下面乔希的建议的:

命名空间MySite.Controls
    局部类面包屑
        继承用户控件

 私人m_BreadCrumbs作为新的列表(中BreadCrumbItem)    < PersistenceMode(PersistenceMode.InnerProperty)GT; _
    公共属性Items()方式列表(中BreadCrumbItem)
        得到
            返回m_BreadCrumbs
        到底得的
        设置(BYVAL值作为列表(中BreadCrumbItem))
            m_BreadCrumbs =价值
        结束设定
    高端物业    私人小组的Page_Load(BYVAL发件人为对象,BYVAL E上EventArgs的)把手MyBase.Load
        绑定()
    结束小组    私人小组绑定()
        lvCrumbs.DataSource =项目
        Me.DataBind()
    结束小组
末级公共类BreadCrumbItem
    私人m_Text作为字符串
    公共属性Text()作为字符串
        得到
            返回m_Text
        到底得的
        设置(BYVAL值作为字符串)
            m_Text =价值
        结束设定
    高端物业    私人m_Url作为字符串
    公共财产网址()作为字符串
        得到
            返回m_Url
        到底得的
        设置(BYVAL值作为字符串)
            m_Url =价值
        结束设定
    高端物业
末级

结束名称空间

然后我的网页code是这样的:

 <%@页面语言=VBAutoEventWireup =false的继承=MySite.MyPage标题=我的页面codebehind =MyPage.aspx。 VB%GT;
<%@注册标签preFIX =我的命名空间=MySite.Controls大会=mysite的%>
<我:面包ID =面包屑=服务器>
    <项目>
        <我:BreadCrumbItem文本=另一页URL =AnotherPage.aspx/>
    < /项目>
< /我:面包>


解决方案

您可以在后面像一个用户控件的code添加属性:

  [PersistenceMode(PersistenceMode.InnerProperty)
公开名单<&列表项GT;项目
{
    得到;
    组;
}

您标记随后将是:

 <我:MyListControl =服务器>
  <项目>
    < ASP:列表项/>
  < /项目>
< /我:myListControl>

为了让这个列表项可以是自己的列表项(我建议这样做,而不是使用asp.net。)你想创建自己的类。

下面是我用一个服务器控件的一个例子(我去掉了很多噪音,因为这等的只是一个骨架):

  [ToolboxData(< {0}:菜单栏RUNAT =服务器>< / {0}:菜单栏>中)
    [System.ComponentModel.DesignTimeVisible(假)]
    公共类菜单栏:WebControl的,IPostBackEventHandler
    {        私人列表<&菜单项GT; _menuItems =新的List<&菜单项GT;();
        [PersistenceMode(PersistenceMode.InnerProperty)
        公开名单<&菜单项GT;的MenuItems
        {
            得到
            {
                返回_menuItems;
            }
        }    }
    [的ToolboxItem(假)]
    [ParseChildren(真的MenuItems)]
    公共类菜单项
    {
        私人字符串_clientClick;
        私人列表<&菜单项GT; _menuItems =新的List<&菜单项GT;();        [本地化(真)
        公共字符串名称{搞定;组; }
        公共字符串HREF {搞定;组; }
        公共字符串ID {搞定;组; }
        [PersistenceMode(PersistenceMode.InnerDefaultProperty)
        公开名单<&菜单项GT;的MenuItems
        {
            {返回_menuItems; }
            集合{_menuItems =价值; }
        }
    }

现在我可以用这个类似:

 <我:菜单栏=服务器ID =菜单栏>
    <&的MenuItems GT;
        <我:菜单项标题=保存HREF =JavaScript的:saveItem(本); />
        <我:菜单项标题=打印HREF =JavaScript的:无效(0);>
            <&的MenuItems GT;
                <我:菜单项标题=preVIEW的href =/>
                <我:菜单项标题=为PDFHREF =JavaScript的:/>
            < /&的MenuItems GT;
        < /我:菜单项>
    < /&的MenuItems GT;
< /我:菜单栏>

I am looking to create a user/server control that will be created with something like the following:

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

I am just looking for a start here: Articles or code samples.

What base class should I inherit from? What to override?

Possibly how to customize what sub items my control accepts (my:ListItem instead of asp:ListItem).

What I am looking to do is create a very simple bread crumb control for a small section of my site. I have it all working with stock ASP.NET controls, but the items are added in code, which means fixing a spelling mistake or formatting bug involves a recompile, which is not ideal.

EDIT:

Here's my code with the addition of Josh's suggestion below:

Namespace MySite.Controls Partial Class BreadCrumbs Inherits UserControl

    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

End Namespace

Then my page code looks like this:

<%@ 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>

解决方案

You can add a property on a user control's code behind like:

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

Your markup would then be:

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

To make it so ListItem can be your own list item (Which I recommend doing as opposed to using asp.net.) You'll want to create your own class.

Here's an example of a Server Control I use (I removed a lot of the noise as such this is just a skeleton):

   [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; }
        }
    }

Now I can use this like:

<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>

这篇关于如何创建使用ASP清单ASP.NET用户/服务器控件:列表项的子控件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆