自己开发asp.net服务器控件(1)-简单的属性声明

先来小试牛刀,试一个HyperLink控件,不过默认显示文字为:“Socan信息港”,链接到:“http://ww.socan.com.cn”
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;

namespace WebControlsByLyj
{
       [DefaultProperty(
"Text")]
       [ToolboxData(
"<{0}:HyperLink runat=server></{0}:HyperLink>")]
       
public class HyperLink : System.Web.UI.Control
       
{
           [Description(
"要显示的链接名")]
           [DefaultValue(
"Socan信息港")]
           [Category(
"Appearance")]
           [Bindable(
true)]
           
public string Text
           
{
               
get
               
{
                   
string s = (string)ViewState["Text"];
                   
return (s == null? "Socan信息港" : s;
               }

               
set
               
{
                   ViewState[
"Text"= value;
               }

           }


           [Description(
"要链接到的地址")]
           [DefaultValue(
"http://www.socan.com.cn")]
           [Category(
"Data")]
           [Bindable(
true)]
           
public string Link
           
{
               
get
               
{
                   
string s = (string)ViewState["Link"];
                   
return (s == null? "http://www.socan.com.cn" : s;
               }

               
set
               
{
                   ViewState[
"Link"= value;
               }

           }


           
protected override void Render(System.Web.UI.HtmlTextWriter writer)
           
{
            
//这是好的方式
               writer.AddAttribute("href", Link);
               writer.AddAttribute(
"target""_blank");
               writer.AddStyleAttribute(
"color""red");
               writer.RenderBeginTag(
"a");
               writer.Write(Text);
               writer.RenderEndTag();
            
//这是不好的方式
               
//writer.Write("<a href='http://www.126.com' style='color:red'>" + Name + "</a>");
           }

       }

}

此控件虽然是有界面的控件,但我没有从WebControl继承,而是直接由Control继承,因为比较简单,当然,如果比较复杂一点的一般从WebControl继承。

1、新建一个项目时,如果是类库,需要引用System.Web,最好加上:
using System.ComponentModel;
using System.Web.UI;

2、这是对控件的描述信息:
       [DefaultProperty("Text")]
       [ToolboxData("<{0}:HyperLink runat=server></{0}:HyperLink>")]
第一句说明查看控件属性时默认到Text属性,第二句说明从控件栏拖动一个时自动产生的代码。

3、这是对控件属性Text的描述信息:
           [Description("要显示的链接名")]
           [DefaultValue("Socan信息港")]
           [Category("Appearance")]
           [Bindable(true)]
属性: • Bindable — 属性可绑定 到数据源。您可以将 Email 字段链接到数据库、XML 文件或任何其他 DataSet。该特性强制 Visual Studio 在控件的可绑定属性列表中显示 Email 属性。
 
• Appearance —属性将显示在 Appearance 类别下的属性视图中。您可以选择想要的任何类别,包括默认类别:Appearance、Accessibility、Behavior、Data、Layout 或 Misc。只要用户选择了属性的类别组织方法,属性将会显示在 Appearance 下。
 
• DefaultValue — 属性具有一个空的默认值。尽管空值对于 Email 字段来说有意义,但对于您添加到控件中的其他属性可能并不合适。当用户将您的控件放到他们的 Web 页上时,选择适当的默认值可为用户免去不计其数的单击操作。
 
• Description — 属性说明显示在控件列表下,并且也可能作为工具提示出现。Email 属性将具有说明。
 
• Localizable — 它会用发送信号的方式通知 ASP.NET 2.0 Framework 该控件包括可以针对不同语言或位置进行配置的文本属性。

看明白上面这些,第二属性的描述也不用介绍了吧

4、 (string)ViewState["Text"];
这句本不想说明,不过在做的时候,我犯了个尚可原谅的错误,我使用了.ToString(),但是出错了,因为当ViewState["Text"]为Null的时候会出现异常,而现在这样就不会,s依然是Null值。

5、在输出的时候,两种方法都可实现:
            //这是好的方式
               writer.AddAttribute("href", Link);
               writer.AddAttribute("target", "_blank");
               writer.AddStyleAttribute("color", "red");
               writer.RenderBeginTag("a");
               writer.Write(Text);
               writer.RenderEndTag();
            //这是不好的方式
               //writer.Write("<a href='http://www.126.com' style='color:red'>" + Name + "</a>");
通常采用上面的方式,好处有两点,一是提供实用方法和枚举减少出错的可能性,二是可依据发出请求的浏览器的版本呈现适当的内容。
 


再来一个有点实用价值的:拖入一个控件,想要弹出消息,只要给它赋一个Text值即可!很实用吧!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebControlsByLyj
{
      [DefaultProperty(
"Text")]
      [ToolboxData(
"<{0}:Alert runat=server></{0}:Alert>")]
      
public class Alert : WebControl
      
{
          [Bindable(
true)]
          [Category(
"Appearance")]
          [DefaultValue(
"")]
          [Localizable(
true)]
          
public string Text
          
{
              
get
              
{
                  String s 
= (String)ViewState["Text"];
                  
return ((s == null? String.Empty : s);
              }


              
set
              
{
                  ViewState[
"Text"= value;
              }

          }


          
protected override void RenderContents(HtmlTextWriter output)
          
{
              
if (!string.IsNullOrEmpty(Text))
                  output.Write(
"<script language='javascript'> alert('" + Text + "');</script>");
          }

      }

}
原文地址:https://www.cnblogs.com/yvesliao/p/856279.html