创建一个BulletedList控件以替换 asp:BulletedList

分享于 

7分钟阅读

Web开发

  繁體 雙語

介绍

我想显示项目项目项目列表( <> 标记内呈现的标记 <ul> 标记),基于一个从某些数据源收集的字符串对象的强类型列表。

我注意到. NET 中有一个 BulletedList 控件,所以我尝试了它。 我把 DataSource 设置为 列表( 字符串) 叫做 DataBind()

它的工作方式。 项目符号列表显示了列表中每个字符串的内容,但它坚持了每个项目的html编码。 在列表( <href="somepage。htm"。> 单击我 </a> ) 中,它呈现为 & in ;一个 href=" somepage.htm"& dce ;单击"me&lt;/a&gt;",不获得超链接。 抱歉,感谢你的自动编码,微软 !

背景

BulletedList 控制和谷歌搜索这个问题上,我花了一点时间,但是它似乎只是 BulletedList的"功能",这是不可以控制的( 我可能是错误的)。 我们写一个 Repeater,而不是在 web。aspx页面中呈现项目,但看起来很凌乱,aspx aspx页面,我想在一个实例中使用它,但不是很好,但是我想这样做。

我把手放在另一个短眼的"功能"框架上,出去享受一个肉肉和葡萄饼和葡萄饼。

在,车间,我决定自己写一个控制,我想我在这里有一个基本的要求,我可以解决。 现在,我只需要回到 Office的路上,一个短套的衬衫,在雨雨中。 我爱曼彻斯特。

开发代码

第一步是创建一个类文件,这是我名为的文件。 为了便于以后使用,我把这个类放在一个命名空间中,并使它继承自。

接下来,创建了名为" Items"的属性,它提供对要呈现的项列表的读/写访问。 记住,我想使用一个强类型的字符串列表。 我将项保存在控件的ViewState 中。

PublicProperty Items() As List(OfString)
 GetIf IsNothing(ViewState("Items")) Then' Instantiate the list of items to a new list; which will allow us to do".Items.Add" from elsewhere in code without' having to worry about null values checks. ViewState("Items") = New list(OfString)
 EndIfReturnDirectCast(ViewState("Items"), List(OfString))
 EndGetSet(ByVal value As List(OfString))
 ViewState("Items") = value
 EndSetEndProperty

我现在可以保存要在页面上显示的字符串列表。 接下来是告诉控件应该如何呈现它们。 我只是重写了控件的" Render"方法,并提供了一些自定义逻辑:

ProtectedOverridesSub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
 ' Only output something if there are items in the collection:If Items.Count> 0Then' Output start tag <ul> writer.RenderBeginTag(HtmlTextWriterTag.Ul)
 ' Output all the itemsForEach s AsStringIn Items
 writer.RenderBeginTag(HtmlTextWriterTag.Li)
 writer.Write(s)
 writer.RenderEndTag()
 writer.WriteLine()
 Next' Output end tag </ul> writer.RenderEndTag()
 EndIfMyBase.Render(writer)EndSub

如你所见,它相当简单。 如果列表中有任何项,则创建打开 <ul> 标记,然后写出其中包含的每个项 <> 一旦所有的项目都写好了 <ul> 标记,并调用基 Render 方法( 它不做任何事情,只是为了完整)。

HTML编码文本

我感谢从安全角度对文本进行编码,从数据存储( 尤其是那些数据来自未知来源) 中检索的HTML数据应该是HTML编码。

为这里,我提供了另一个属性 EncodeHtml,用于允许控件的用户决定是否要在它的呈现之前编码输出。 属性是保存在 ViewState 中的简单布尔值:

PublicProperty EncodeHtml() AsBooleanGetIf IsNothing(ViewState("EncodeHtml")) ThenReturnFalseElseReturnDirectCast(ViewState("EncodeHtml"), Boolean)
 EndIfEndGetSet(ByVal value AsBoolean)
 ViewState("EncodeHtml") = value
 EndSetEndProperty

然后修改 Render 方法以考虑这里属性,如果需要,html会对文本进行编码。 这就说明了控制的实现。

ProtectedOverridesSub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
 ' Only output something if there are items in the collection:If Items.Count> 0Then' Output start tag <ul> writer.RenderBeginTag(HtmlTextWriterTag.Ul)
 ' Output all the itemsForEach s AsStringIn Items
 writer.RenderBeginTag(HtmlTextWriterTag.Li)
 If EncodeHtml Then writer.Write(HttpContext.Current.Server.HtmlEncode(s))
 Else writer.Write(s)
 EndIf writer.RenderEndTag()
 writer.WriteLine()
 Next' Output end tag </ul> writer.RenderEndTag()
 EndIfMyBase.Render(writer)EndSub

使用代码

使用代码很简单。 首先,在 。aspx的顶部控制控件

<%@RegisterTagPrefix="SCC"Namespace="SCC.WebUserControls"%>

接下来,在 标记中添加该控件,你希望将项目符号列表显示在该标记中:

<SCC:BulletedListID="blHyperlinks"runat="server"/><!--<span class="code-comment"> Render all items"as-is" --></span><SCC:BulletedListID="blSafeHtml"runat="server"EncodeHtml="true"/><!--<span class="code-comment"> Encode HTML --></span>

最后,在 Page_Load 或者类似的情况下,将控件绑定到所需的字符串列表:

Dim Hyperlinks AsNew List(OfString)Me.blHyperlinks.Items = Hyperlinks

就这样,"应该工作"。

可下载的文件包含一个完整的xml注释代码清单供你参考。 欢迎评论( 特别是,如果你能告诉我 asp:BulletedList 可以配置为 html编码你从强类型字符串列表绑定到它的文本)。

历史记录

  • 1.0 ( 原始,14 2008年07月 ): 原始版本。
  • 如果列表中没有任何项,则 1.1 ( 15 2008年07月 ) 将在控件呈现时修复空引用。

控制  rep  asp  repl  替换  Bullet  
相关文章