自己开发asp.net服务器控件(1)-简单的属性声明
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.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>");
}
}
}