您的位置:首页 > 编程语言 > ASP

asp.net2.0自定义服务器控件开发(二)

2008-02-06 16:56 435 查看

using System;


using System.ComponentModel;


using System.Security;


using System.Security.Permissions;


using System.Web;


using System.Web.UI;


using System.Web.UI.WebControls;




namespace Samples.AspNet.CS.Controls




...{


    [


    DefaultProperty("Email"),


    //true:把包含在服务器控件标记内的元素解释为Text属性 (Property)


    //false:解释为控件


    ParseChildren(true, "Text"),


    ToolboxData("<{0}:MailLink runat="server"> </{0}:MailLink>")


    ]


    public class MailLink : WebControl




    ...{


        //默认输出标记为span


        //更改方法一


        //public MailLink()


        //    : base(HtmlTextWriterTag.A)


        //{ }




        [


        Bindable(true),


        Category("Appearance"),


        DefaultValue(""),


        Description("The e-mail address.")


        ]


        public virtual string Email




        ...{


            get




            ...{


                string s = (string)ViewState["Email"];


                return (s == null) ? String.Empty : s;


            }


            set




            ...{


                ViewState["Email"] = value;


            }


        }




        [


        Bindable(true),


        Category("Appearance"),


        DefaultValue(""),


        Description("The text to display on the link."),


        Localizable(true),


        //将Text属性定义为内部文本,默认属性


        PersistenceMode(PersistenceMode.InnerDefaultProperty)


        ]


        public virtual string Text




        ...{


            get




            ...{


                string s = (string)ViewState["Text"];


                return (s == null) ? String.Empty : s;


            }


            set




            ...{


                ViewState["Text"] = value;


            }


        }




        //方法二


        protected override HtmlTextWriterTag TagKey




        ...{


            get




            ...{


                return HtmlTextWriterTag.A;


            }


        }




        protected override void AddAttributesToRender(


            HtmlTextWriter writer)




        ...{


            //base.AddAttributesToRender(writer);


            writer.AddAttribute(HtmlTextWriterAttribute.Href,


                "mailto:" + Email);


        }




        protected override void RenderContents(HtmlTextWriter writer)




        ...{


            if (Text == String.Empty)




            ...{


                Text = Email;


            }


            //进行html编码


            writer.WriteEncodedText(Text);


        }


    }


}



 

以上MailLink类继承自 System.Web.UI.WebControls.WebControl

再来看一个MailLink2,它继承于System.Web.UI.Control


        protected override void Render(HtmlTextWriter writer)




        ...{


            //先给标记添加样式和属性,然后再输出标记


            writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");


            writer.AddAttribute(HtmlTextWriterAttribute.Href, "mailto:" + Email);


            writer.RenderBeginTag(HtmlTextWriterTag.A);


            writer.Write(Text);


            writer.RenderEndTag();


        }

比较上面两段代码,执行结果一致,明显MailLink2的代码比较简洁也较为灵活(注意都是先添加样式和属性,再输出标记的)

但是在属性编辑器里面,MailLink控件有ForeColor等属性可供设置

而MailLink2控件是没有的

因为MailLink控件继承自WebControl

为什么继承自Control的MailLink2只需要重写Render方法呢


//RenderControl方法的基本实现


 public void RenderControl(HtmlTextWriter writer)




 ...{


 if(Visible)




 ...{


 Render(writer);


 }


 }


 //Render方法基本实现


 protected virtual void Render(HtmlTextWriter writer)




 ...{


 RenderChildren(writer);


 }


 //RenderChildren方式基本实现


 protected virtual void RenderChildren(HtmlTextWriter writer)




 ...{


 foreach (Control c in Controls)




 ...{


 c.RenderControl(writer);


 }


 }

发现一个问题

不管是MailLink还是MailLink2控件都是读取标记之间的内容作为Text属性的

但是在属性编辑器中对Text属性进行赋值,标记之间不会写入任何东西。

这个以后再研究,先放着。

最后更正一个错误

MailLink中的AddAttributesToRender方法中的base.AddAttributesToRender(writer);不能删除掉

应该始终调用,作用就是将父类(WebControl类)的相关属性(ForeColor)添加到开始标记中去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息