2009-04-27 3 views
9

다음과 같은 내용으로 생성 될 사용자/서버 컨트롤을 만들려고합니다.asp : ListItem 목록을 자식 컨트롤로 사용하는 ASP.NET 사용자/서버 컨트롤을 만드는 방법은 무엇입니까?

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

기사 또는 코드 샘플.

어떤 기본 클래스에서 상속해야합니까? 재정의 할 대상은 무엇입니까?

아마도 내 컨트롤에서 허용하는 하위 항목을 사용자 지정하는 방법 (my : ListItem 대신 asp : ListItem).

내가하고 싶은 것은 내 사이트의 작은 부분에 대한 아주 간단한 빵 부스러기 컨트롤을 만드는 것입니다. 나는 재고가있는 ASP.NET 컨트롤을 모두 사용하고 있지만 항목은 코드에 추가되어 철자 오류를 수정하거나 버그를 서식 지정하는 것이 이상적이지 않은 재 컴파일을 포함합니다.

편집 :

다음은 조쉬의 제안을 추가 한 코드입니다.

네임 스페이스 MySite.Controls 부분 클래스 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 

끝 네임 스페이스

그런 다음 내 페이지 코드는 다음과 같습니다.

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

최종 HTML 마크 업 목표는 무엇입니까? 같은 뭔가 :

  • Test1을
  • Test2를
을 ListItem이 아닌 다른 유형을 사용에 대한 필요성은 무엇입니까? – ahsteele

+0

예, 내가 뱉어내는 HTML은 ul/li입니다. asp : ListItem에 대한 필요성이 없습니다. 질문을 할 때 그 밖에 무엇을 부르는지 알 수 없었습니다. – slolife

답변

11

당신은 같은 뒤에 사용자 정의 컨트롤의 코드에 속성을 추가 할 수 있습니다

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

마크 업이 다음과 같다 :

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

그것을 만들려면을 ListItem 자신의 목록 항목이 될 수 있도록 (나는 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; } 
     } 
    } 

지금 나는이 같은를 사용할 수 있습니다 : 여기

내가 사용하는 서버 컨트롤의 예 (I는 이와 같은 소음을 많이 단지 골격이 제거)

<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

이것이 필요한 것 같습니다.지금 내 전화 끊기는 왜 @ Register TagPrefix = "my"Namespace = "MySite.Controls"가 사용자 지정 목록 항목 클래스를 가져 오지 못하는 이유입니까? 어떤 아이디어? 그것은 부모 컨트롤 (귀하의 예제에서는 Menubar) 가져옵니다하지만 내 : MyListItem Items 태그 안에 할 수 없습니다. – slolife

+0

가지고있는 코드를 공유 할 수있는 아이디어가 없습니까? – JoshBerke

+0

신경 쓰지 마라. @Register 지시문에 Assembly 매개 변수를 추가해야했습니다. 이제 작동합니다. 고마워요 조쉬 – slolife

0

asp : Repeater를 사용하여 이동 경로의 원하는 개체 목록에 바인딩합니다. 템플릿을 사용하여 항목 자체와 구분 기호를 사용자 정의 할 수 있습니다.

+0

나는 리피터 컨트롤보다 좀 더 정의 된 것을 원했다. – slolife

관련 문제