我正在学习服务器控件开发并寻找适当的指令,以便通过源以声明方式设置数据。例如,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; }
}
答案 0 :(得分:1)
您正在寻找的答案是: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>