• ASP.NET控件开发学习笔记第5回 HtmlTextWriter的相关枚举


     

    5 HtmlTextWriter的相关枚举

    HtmlTextWriter是什么?我们来看这句代码:

    protected override void Render(HtmlTextWriter writer)

    喔!原来是Control类中的虚方法Render()里的参数。这一回偷点懒,理论部分翻译《Professional ASP.NET 2.0 Server Control and Component Development》一书里对它的相关阐述,自己想多累,翻译大师写的东西就爽得多了!

    在调用Control类的Render方法时,给HtmlTextWriter类的Write方法传递字符串会出造成以下问题:

    l         字符串操作容易导致错误而编译器不能捕捉这些错误。例如下面的错误只会在运行时被捕捉:

    Writer.Write(“<spon/>”);

    l         您失去了Visual Studio的智能提示的支持。

    l         您不得不为不同的浏览器编写不同的HTML标记。

    HtmlTextWriterTagHtmlTextWriterAttributeHtmlTextWriterStyle枚举解决了所有的问题。HtmlTextWriterTag枚举值拥有和HTML4.0标签一样的名称,例如HtmlTextWriterTag.Span对应HTML<span>标签。HtmlTextWriterAttribute枚举值和HTML4.0的属性名称相同,如HtmlTextWriterAttribute.IDHTMLid属性相对应。最后,HtmlTextWriterStyle枚举值和CSS样式属性同名,如HtmlTextWriterStyle.WidthCSS样式属性相对应。

    这三个枚举提供了以下好处:

    l         因为这三个枚举是C#中的类型,您可以从编译器的类型检查中得到好处,以避免相关字符串操作的问题。(译者注:也就是说当你的Write方法输出了错误的HTML代码编译器不会报错)

    l         Visual Studio为这些枚举提供了智能提示的支持。

    l         ASP.NET框架为这些枚举提供了两个版本。第一个版本编译按照标准的HTML4.0进行编译,另一个版本按照标准的HTML3.2进行编译。ASP.NET框架允许使用您的自定义控件的客户端配置它们的环境以使ASP.NET框架使用跟这些环境相对应的版本。您的自定义控件不需要为不同的浏览器创建不同的HTML标记文本。只要使用这些枚举,ASP.NET框架将会自动地使用正确的版本。如果使用字符串,将不会得到这些好处。

    好,翻译完这段理论知识,大家对HtmlTextWriter里的枚举有了些感性的认识,先着手把我们的例子运用以上知识修改,然后再继续翻译。首先把上一回中的bin目录删除,这样做是为了避免bin文件夹中的DLLApp_Code文件夹中的cs控件冲突。如果没有App_Code文件夹,请建一个,然后把上一回中的linksList.cs文件拷贝到里面,打开并修改代码如下:

    5-1代码1linksList.cs代码


    using System;
    using System.Web.UI;
    using System.Data;
    using System.Data.OleDb;
    using System.ComponentModel;
    [assembly:TagPrefix(
    "MyControl""CG")]
    namespace MyControl
    {
            [DefaultPropertyAttribute(
    "TitleText")]
        [ToolboxData(
    "<{0}:LinksControl "+
                     
    "TitleText='我的链接' "+ 
                     
    "XmlFileName='linksList.xml' "+
                     
    "runat='server'></{0}:LinksControl>")]
        
    public class LinksControl:Control
        {
            
    private string _titleText;
            
    private string _xmlFileName;
                    [BrowsableAttribute(
    true)]
            [DescriptionAttribute(
    "设置标题栏的名称")]
            [DefaultValueAttribute(
    "我的链接")]
            [CategoryAttribute(
    "外观")]
            
    public virtual string TitleText
            {
                
    get { return _titleText; }
                
    set { _titleText=value; }
            }
                    [BrowsableAttribute(
    true)]
            [DescriptionAttribute(
    "存放链接的xml文件名")]
            [DefaultValueAttribute(
    "")]
            [CategoryAttribute(
    "数据")]
            
    public virtual string XmlFileName
            {
                
    get { return _xmlFileName; }
                
    set { _xmlFileName=value; }
            }
            
    protected override void Render(HtmlTextWriter writer)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Ul);
                
    if (_titleText!=null)
                {
                    writer.AddAttribute(HtmlTextWriterAttribute.Id, 
    "caption");
                    writer.RenderBeginTag(HtmlTextWriterTag.Li);
                    writer.Write(_titleText);
                    writer.RenderEndTag();
                }
                
    if (_xmlFileName != null)
                {
                    DataSet ds 
    = new DataSet();
                    ds.ReadXml(Page.Server.MapPath(_xmlFileName));
                    
    foreach (DataRow row in ds.Tables["link"].Rows)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Li);
                        writer.AddAttribute(HtmlTextWriterAttribute.Href, row[
    "url"].ToString());
                        writer.AddAttribute(HtmlTextWriterAttribute.Target, 
    "_blank");
                        writer.RenderBeginTag(HtmlTextWriterTag.A);
                        writer.Write(row[
    "name"].ToString());
                        writer.RenderEndTag();
                        writer.RenderEndTag();
                    }
                }
                writer.RenderEndTag();
            }
        }
    }

     

    确保例4-1中的linkslist.aspx文件和之前使用的linkslist.css文件还在,在浏览器中运行linksList.cs,结果是否还是老样子?只是这一次我们使用了上面所讲的三个枚举。这段代码我花了挺长时间调试,后面才知道要先AddAttribute(加属性)再RenderBeginTag(声明属性所在的标签),有点晕!总之掌握它需要多多练习。好,做完这个例子,大概也知道上面讲的是什么回事了,继续翻译。

    HTML标记文本由HTML元素组成,如tabletrtdthselectoptioninput等等。一般情况下,HTML元素由以下五部分组成:

    l         起始标签(opening tag),如<table><tr><td><th><select><option><input>等等

    l         属性(Attribute),如idnametypevalue等等。一个元素的属性放在起始标签中,如:

    <table id=”mytable” name=”mytable”>

    l         样式属性(style attributes),诸如widthheight等等。一个元素的样式属性放在起始标签中,并做为style属性的一部分如:

    <table style = ”100px; height:200px”>

    l         内容(Content),一个元素的内容由文本,其它元素或两者同时组成。

    l         结束标签(closing tag),如</table></tr>等等。

    可以使用HtmlTextWriter类中的方法输出以上部分:

    l         RenderBeginTag:描绘或产生一个HTML元素的起始标签。

    l         AddAttribute:每个元素可以通过调用这个方法一次以产生或描绘HTML元素起始标签中的属性。

    l         AddStyleAttribute:每个style属性可以通过调用这个方法一次以产生或描绘HTML元素的部分style属性。

    l         WriteHTML元素可以包含文本或其他元素,或两者皆有。使用Write方法以产生任何的文字内容,如stringintfloat等等。您需要使用RenderBeginTabAddAttributeAddStyleAttributeRenderEndTag方法来产生非文本内容,如一个元素的子元素。

    l         RenderEndTab:描绘或产生一个HTML元素的结束标签。

    好,翻译完了,准备看《长江七号》,有什么问题下回再讲。

  • 相关阅读:
    Apache Kylin v3.0.0-alpha 发布
    Apache Kylin在美团点评的应用
    Kylin 架构模块简介
    Kylin 1 背景、历史与使命
    谈MongoDB的应用场景
    Linux 内存Cache和Buffer理解
    Linux 下查看内存使用情况方法总结
    mongodb 集群配置文件
    MongoDB bindIp 与 bindIpAll
    MongoDB 权限认证
  • 原文地址:https://www.cnblogs.com/abatei/p/1083889.html
Copyright © 2020-2023  润新知