2009-04-27 41 views
9

Tôi đang tìm kiếm để tạo ra một điều khiển người dùng/máy chủ đó sẽ được tạo ra với một cái gì đó như sau:Cách tạo điều khiển người dùng/máy chủ ASP.NET sử dụng danh sách asp: ListItem làm điều khiển con?

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

tôi chỉ tìm kiếm một sự khởi đầu ở đây: bài viết hoặc mẫu mã.

Tôi nên kế thừa lớp cơ sở nào? Những gì cần ghi đè?

Có thể làm cách nào để tùy chỉnh các mục phụ mà điều khiển của tôi chấp nhận (my: ListItem thay vì asp: ListItem).

Điều tôi muốn làm là tạo một điều khiển bánh mì rất đơn giản cho một phần nhỏ của trang web của tôi. Tôi có tất cả làm việc với kiểm soát chứng khoán ASP.NET, nhưng các mục được thêm vào trong mã, có nghĩa là sửa chữa một lỗi chính tả hoặc lỗi định dạng liên quan đến một biên dịch lại, đó không phải là lý tưởng.

EDIT:

Dưới đây là mã của tôi với việc bổ sung đề nghị của Josh dưới đây:

Namespace MySite.Controls Breadcrumbs partial class 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

Sau đó, mã trang của tôi trông giống như sau:

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

Mục tiêu đánh dấu HTML cuối cùng là gì? Cái gì như:

  • Test1
  • Test2
nhu cầu sử dụng ListItem và không một số loại khác là gì? – ahsteele

+0

Có, HTML mà tôi đang nhổ ra là ul/li. Không cần thiết cho asp: ListItem, chỉ không biết những gì khác để gọi nó khi tôi hỏi câu hỏi – slolife

Trả lời

11

Bạn có thể thêm một tài sản trên mã một điều khiển người dùng đằng sau như:

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

đánh dấu của bạn sau đó sẽ là:

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

Để làm cho nó rất ListItem có thể mục danh sách của riêng bạn (Mà tôi khuyên bạn nên làm như trái ngược với việc sử dụng asp.net.) Bạn sẽ muốn tạo ra lớp học của riêng bạn.

Dưới đây là một ví dụ về một vụ kiểm soát tôi sử dụng (tôi loại bỏ rất nhiều tiếng ồn như thế này chỉ là một bộ xương):

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

Bây giờ tôi có thể sử dụng như thế này:

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

Điều này dường như là những gì tôi cần.Hiện giờ tôi chỉ treo máy là lý do tại sao @Register TagPrefix = "my" Namespace = "MySite.Controls" của tôi không hoạt động để có được hạng mục danh sách tùy chỉnh? Bất kỳ ý tưởng? Nó được kiểm soát cha mẹ (Menubar trong ví dụ của bạn) nhưng tôi không thể làm của tôi: MyListItem bên trong thẻ Items. – slolife

+0

Không có ý tưởng nào bạn có thể chia sẻ mã bạn nhận được? – JoshBerke

+0

Đừng bận tâm. Cần thêm thông số Assembly vào chỉ thị @Register. Bây giờ nó hoạt động. Cảm ơn Josh – slolife

0

Sử dụng một asp: Repeater sau đó liên kết nó với một danh sách các đối tượng bạn muốn trong breadcrumb của bạn. Bạn có thể sử dụng mẫu để tùy chỉnh các mục và dải phân cách.

+0

Tôi muốn một cái gì đó nhiều hơn một chút được xác định hơn so với kiểm soát lặp lại – slolife

Các vấn đề liên quan