Предоставление декларативных данных для элементов управления - PullRequest
1 голос
/ 28 февраля 2012

Я нахожусь в процессе изучения разработки серверных элементов управления и ищу правильные инструкции, позволяющие декларативно настраивать данные через источник. Например, элемент управления dropdownlist предоставляет декларативные данные, как показано ниже

<asp:DropDownList id="dropdown" runat="server">
    <asp:ListItem text="Project Initiation" value="1"></asp:ListItem>
    <asp:ListItem text="Documentation" value="2"></asp:ListItem>
</asp:DropDownList>

аналогичным образом я ищу декларативное предоставление данных моему простому элементу управления меню, который отображает изображение, окруженное изображением, как показано ниже (выходная разметка) из источника данных

<a>
 <img src="" />
</a>

Пожалуйста, не указывайте мне ссылку, по крайней мере, любой может сделать это. Я хотел бы получить четкое объяснение того, что необходимо сделать для обеспечения такой функциональности. Я хотел бы, чтобы мой окончательный источник выглядел так, как показано ниже

<asp:sidebar runat="server" id="sb">
 <asp:sidebaritem navigateurl="" imageurl="" label=""></asp:sidebaritem>
</asp:sidebar>

Класс элементов боковой панели определен ниже, и у меня тоже есть свойство

класс

public class SidebarItem
 {
   private string _navigateUrl;

   public string NavigateUrl
    {
       get { return _navigateUrl; }
       set { _navigateUrl = value; }
    }
    . . . 
 }

свойство

[PersistenceMode(PersistenceMode.InnerProperty)]
[NotifyParentProperty(true)]
public ICollection<SidebarItem> Items
{
    get { return _sidebarItems; }
    set { _sidebarItems = value; }
}

1 Ответ

1 голос
/ 03 марта 2012

Ответ, который вы ищете здесь: http://msdn.microsoft.com/en-us/library/9txe1d4x.aspxПоскольку вы просили не просто ссылку, вот пример решения, характерного для вашего сценария:

[
AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal),
DefaultProperty("Items"),
ParseChildren(true, "Items"),
ToolboxData("<{0}:SideBar runat=\"server\"> </{0}:SideBar>")
]
public class SideBar : WebControl
{
    private ArrayList itemsList;

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    //[Editor(typeof(ContactCollectionEditor), typeof(UITypeEditor))]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public ArrayList Items
    {
        get
        {
            if (itemsList == null)
            {
                itemsList = new ArrayList();
            }
            return itemsList;
        }
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.RenderBeginTag(HtmlTextWriterTag.Ul);
        foreach (object o in itemsList)
        {
            SideBarItem item = (SideBarItem)o;
            writer.RenderBeginTag(HtmlTextWriterTag.Li);
            writer.AddAttribute(HtmlTextWriterAttribute.Href, item.NavigateUrl);
            writer.RenderBeginTag(HtmlTextWriterTag.A);
            writer.AddAttribute(HtmlTextWriterAttribute.Src, item.ImageUrl);
            writer.RenderBeginTag(HtmlTextWriterTag.Img);
            writer.RenderEndTag(); // Img
            writer.RenderEndTag(); // A
            writer.RenderEndTag(); // Li
        }
        writer.RenderEndTag(); // Ul
    }
}


[TypeConverter(typeof(ExpandableObjectConverter))]
public class SideBarItem
{
    public SideBarItem()
        : this(String.Empty, String.Empty, String.Empty)
    {
    }

    public SideBarItem(string imgUrl, string navUrl, string label)
    {
        ImageUrl = imgUrl;
        NavigateUrl = navUrl;
        Label = label;
    }

    [DefaultValue("")]
    [NotifyParentProperty(true)]
    public String ImageUrl { get; set; }

    [DefaultValue("")]
    [NotifyParentProperty(true)]
    public String NavigateUrl { get; set; }

    [DefaultValue("")]
    [NotifyParentProperty(true)]
    public String Label { get; set; }
}

Тогда файл ASPX будет выглядеть следующим образом:Ссылка

<%@ Register Assembly="MyProject" Namespace="MyProject" TagPrefix="cc1" %>

Реализовано

    <cc1:SideBar ID="SideBar1" runat="server">
        <cc1:SideBarItem ImageUrl="#" NavigateUrl="#" />
        <cc1:SideBarItem ImageUrl="#" NavigateUrl="#" />
    </cc1:SideBar>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...