推荐设备MORE

微信小程序为何而来—上海广

微信小程序为何而来—上海广

疑难问题

控制兼容器-基本

日期:2021-02-20
我要分享
控制兼容器-基本控制兼容器-高些级一点的兼容器控制兼容器-.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 文档