控制兼容器-基本控制兼容器-高些级一点的兼容器控制兼容器-.browser 文档
在 ASP.NET 中 Label 控制在輸出到顾客端时是一个 span 控制,ListBox 輸出到顾客端时是一个 select 控制,BulletedList 輸出到顾客端时是一个 ul 控制……
换句话说 ASP.NET 的控制和 HTML 控制存有一定的联络,那麼我并不能够变更这类联络呢?例如我想把 ASP.NET 中的 Label 控制与 HTML 中的 div 控制相匹配起來,并不能够呢?
能够的,这便是这节要探讨的內容,大家以 BulletedList 为例子,大家不期待 BulletedList 輸出的是 ul 目录,只是一项一个文章段落 p 的方式,这儿也不要探讨輸出 ul 好還是輸出 p 好。
最先
大家要创建一个 class 放到 App_Code 文档夹中,这一类的功效便是重新写过 ASP.NET 控制到 HTML 控制的变换,该类编码以下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.Adapters;
namespace Cftea
{
public class BulletedListAdapter : WebControlAdapter
{
protected override void RenderBeginTag(HtmlTextWriter writer)
{
//base.RenderBeginTag(writer);
}
protected override void RenderContents(HtmlTextWriter writer)
{
BulletedList bl = Control as BulletedList;
if (bl != null)
{
int i = 0;
for (i = 0; i bl.Items.Count; i++)
{
writer.WriteBeginTag("p");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Write(bl.Items[i].Text);
writer.WriteEndTag("p");
}
}
//base.RenderContents(writer);
}
protected override void RenderEndTag(HtmlTextWriter writer)
{
//base.RenderEndTag(writer);
}
}
}
类名随意起,但该类要承继于 WebControlAdapter,WebControlAdapter 的名字室内空间是 System.Web.UI.WebControls.Adapters。
轻载三个涵数:RenderBeginTag,RenderContents,RenderEndTag。
因为大家要所有重新写过 BulletedList 的輸出,因此要在这里三个涵数中来掉对父类的启用,即程序中注解掉的一部分。
p 和 ul 不一样,p 是一个新项目一个,而 ul 下一级还必须 li,因此大家只必须在 RenderContents 中提升內容。
BulletedList bl = Control as BulletedList; as 用以在适配的引入种类中间实行变换,
writer.WriteBeginTag("p"); 写刚开始标识,全自动加上“ ”。
writer.Write(HtmlTextWriter.TagRightChar); 写“ ”,因为 WriteBeginTag 不容易全自动加上“ ”,因此这儿要手动式写“ ”。
writer.Write(bl.Items[i].Text); 写每个 item 的文本。
writer.WriteEndTag("p"); 写完毕标识,全自动加上“ ”和“ ”。
随后
轻载类早已写好啦,放到 App_Code 文件目录下,但还必须进一步设定才合理。
在建一个 App_Browsers 文档夹,再在建一个 browser 文档,一样文档名其实不关键(好像放到 ASP.NET 文档夹(例如:App_Browsers、App_Code、App_Themes、bin)下边的文档,其文档名也不关键,关键的是标志、ID、名字室内空间,而且 ASP.NET 会全自动搜索、全自动升级,运用起來便捷得不可了。)
browser 文档的编码以下:
browsers
browser refID="Default"
controlAdapters
adapter controlType="System.Web.UI.WebControls.BulletedList"
adapterType="Cftea.BulletedListAdapter" /adapter
/controlAdapters
/browser
/browsers
browser refID="Default" refID="Default" 表明针对全部的访问器都运用其 controlAdapters。
adapter 的 controlType 表明要变换哪一类控制。
adapter 的 adapterType 文件格式为“名字室内空间 + 类名”,表明 controlType 交给 adapterType 标示的类解决。
进行
这时大家再在 .aspx 中加上一个 BulletedList,輸出时,也不再是 ul,只是 p 了。
运用兼容器,大家能够把 ASP.NET 的控制投射到 HTML 中的某一类控制,还可以投射到一类大家自身设计方案的“控制”,例如带挑选框的往下拉目录框。
大家还将在后边的更新连载中实际解读这节流程的二点內容,特别是在是第二点,能够依据不一样的访问器对控制开展不一样的变换。
表明
上边 WriteBeginTag 更强的作法是应用 RenderBeginTag;而 "p" 也应用 HtmlTextWriterTag.P;WriteEndTag("p") 应用 RenderEndTag() 全自动配对。
控制兼容器-基本控制兼容器-高些级一点的兼容器控制兼容器-.browser 文档