asp.NET去掉form的runat="server"照样使用服务器控件,包括表单的服务器控件

前两天看了朋友的一网站,发现没有如何垃圾代码,连<div class="aspNetHidden">这个也没有,当时就问了下他是怎么做的,结果告诉我把form的runat="server"去掉就可以了,但不能使用表单的服务控件,一些Repeater控件什么的还是可以用的,于是去看了下,发现Repeater是继承System.Web.UI.Control的,而一般的表单控件(服务器控件)是继承System.Web.UI.WebControls.WebControl的,于是自己写了个简单的Button控件,我不继承System.Web.UI.WebControls.WebControl而是继承System.Web.UI.Control,然后测试,把form的runat="server"去掉照样可以。。。。 然后在加事件,发现没用,于是想了下,应该是没有事件的状态试图导致的,所有只能自己去激发了,果断重写OnLoad方法,去里面检测是否是这个Button提交的,是的话就去看看客户有没有绑定事件,有就激发,这样就都正常了,但测试后发现还有一个问题,那就是这个事件不能用代码删除掉,因为在提交过来后编译时,还是会把事件编译进去,那怎么解决了,,,,想了N久,用ViewState属性是最好的,但事件貌似只能出现在+=或-=的情况,但委托是可以的。。。所有就写了个私有的委托,把按钮的点击事件写成add和remove模式,但add和remove时,都是去操作那个委托,如何在重写OnLoad方法里面的时候就使用自己的委托,这样就可以删除了。。。。

下面把我的代码上传上来吧。。。。           (当你拖动控件到页面时,可能会提示要在form的runat="server"里面,点击确定,在把form的runat="server"去掉 可以了)

最后欢迎来自然框架企鹅群:82598514    快乐你我_快乐编程

/// <summary>
/// 在网页上显示下压按钮控件
/// </summary>
[DefaultProperty("Text")]
[DefaultEvent("Click")]
[ToolboxData("<{0}:Button runat=server></{0}:Button>"), System.Drawing.ToolboxBitmap(typeof(Button), "Button.bmp")]
public class Button : ControlBase, IPostBackEventHandler
{
/// <summary>
/// 初始化<see cref="Button"/>类的新实例
/// </summary>
public Button()
: base(HtmlTextWriterTag.Input)
{

}
/// <summary>
/// 获取或设置在 <see cref="Button"/> 控件中显示的文本标题
/// </summary>
[Category("Appearance")]
[DefaultValue("提交")]
[Localizable(true)]
[Description("设置按钮显示的文本标题")]
public string Text
{
get {
if (ViewState["Text"].IsNull())//自定义扩展方法 等效于!Object.ReferenceEquals(null,OnViewClick)
{
ViewState["Text"] = "提交";
}
return (string)ViewState["Text"];
}
set {
ViewState["Text"] = value;
}
}
/// <summary>
/// 在单击 <see cref="Button"/> 控件时发生
/// </summary>
[ Description("单击控件时发生")]
public event EventHandler Click
{
add {
OnViewClick = value;
}
remove {

OnViewClick = null;
}
}
[Browsable(false)]
private EventHandler OnViewClick
{
get { return (EventHandler)ViewState["OnClick"]; }
set { ViewState["OnClick"] = value; }
}
/// <summary>
/// 获取或设置在引发某个 <see cref="Button" /> 控件的 <see cref="Button.Click" /> 事件时所执行的客户端脚本
/// </summary>
[DefaultValue(""), Description("在提交前执行的客户端脚本"), Themeable(false), Category("Behavior")]
public virtual string OnClientClick
{
get
{

string str = (string)this.ViewState["OnClientClick"];
if (str == null)
{
return string.Empty;
}
return str;
}
set
{
this.ViewState["OnClientClick"] = value;
}
}
// public virtual bool isSubmit
/// <summary>
/// 当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件
/// </summary>
/// <param name="eventArgument">表示要传递到事件处理程序的可选事件参数的 <see cref="System.String"/></param>
public void RaisePostBackEvent(string eventArgument)
{
if (!OnViewClick.IsNull())//自定义扩展方法 等效于!EventHandler.ReferenceEquals(null,OnViewClick)
{
OnViewClick.Invoke(this, new EventArgs());
}
}
/// <summary>
/// 重写引发 <see cref="System.Web.UI.Control.Load"/> 事件
/// </summary>
/// <param name="e">包含事件数据的 System.EventArgs 对象</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!OnViewClick.IsNull())//自定义扩展方法 等效于!EventHandler.ReferenceEquals(null,OnViewClick)
{
string temp = Page.Request.Form[this.ID];
if (!temp.IsNull())
{
RaisePostBackEvent(temp);
}
}
}
protected override void RenderChildren(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.ID);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
base.RenderChildren(writer);
if (!this.OnClientClick.IsNullOrWhiteSpace())//自定义扩展方法 等效于!string.IsNullOrWhiteSpace(this.OnClientClick)
{
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, this.OnClientClick);
}
writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);

}
}
[ParseChildren(true), Themeable(true), PersistChildren(false)]
public class ControlBase:System.Web.UI.Control
{
private HtmlTextWriterTag htmltag;
public ControlBase(HtmlTextWriterTag tag = HtmlTextWriterTag.Span)
{
htmltag = tag;
}
private Style controlsStyle;
/// <summary>
/// 获取或设置由 Web 服务器控件在客户端呈现的Style样式
/// </summary>
[Browsable(false), Description("在客户端呈现的级联样式表 (CSS) 类"), Editor("System.ComponentModel.Design.MultilineStringEditor,System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))]
public virtual Style Styles
{
get
{
if (controlsStyle.IsNull())
{
controlsStyle = new Style();
}
return controlsStyle;
}
set {
controlsStyle = value;
}
}
/// <summary>
/// 获取或设置由 Web 服务器控件在客户端呈现的级联样式表 (CSS) 类
/// </summary>
[Category("Appearance"), DefaultValue(""), Description("在客户端呈现的级联样式表 (CSS) 类"), System.Web.UI.CssClassProperty]
public virtual string CssClass { get { return Styles.CssClass; } set { Styles.CssClass = value; } }
/// <summary>
/// 获取或设置 Web 服务器控件的宽度。
/// </summary>
[Category("Layout"), DefaultValue(typeof(Unit), ""), Description("器控件的宽度")]
public virtual Unit Width
{
get
{
return Styles.Width;
}
set
{
Styles.Width = value;
}
}
/// <summary>获取或设置 Web 服务器控件的背景色。</summary>
/// <returns>表示控件背景色的 <see cref="T:System.Drawing.Color" />。默认值为 <see cref="F:System.Drawing.Color.Empty" />,表示未设置此属性。</returns>
[Category("Appearance"), DefaultValue(typeof(Color), ""), Description("设置 Web 服务器控件的背景色"), TypeConverter(typeof(WebColorConverter))]
public virtual Color BackColor
{
get {
return this.Styles.BackColor;
}
set {
this.Styles.BackColor = value;
}
}
/// <summary>获取或设置 Web 控件的边框颜色。</summary>
/// <returns>表示控件的边框颜色的 <see cref="T:System.Drawing.Color" />。默认值为 <see cref="F:System.Drawing.Color.Empty" />,表示未设置此属性。</returns>
[Description("边框颜色"), Category("Appearance"), DefaultValue(typeof(Color), ""), TypeConverter(typeof(WebColorConverter))]
public virtual Color BorderColor
{
get
{
return this.Styles.BorderColor;
}
set
{
this.Styles.BorderColor=value;
}
}
/// <summary>获取或设置 Web 服务器控件的边框宽度。</summary>
/// <returns>
///<see cref="T:System.Web.UI.WebControls.Unit" />,表示 Web 服务器控件的边框宽度。默认值为 <see cref="F:System.Web.UI.WebControls.Unit.Empty" />,表示未设置此属性。</returns>
/// <exception cref="T:System.ArgumentException">指定的边框宽度是负值。</exception>
[Description("控件的边框宽度"), Category("Appearance"), DefaultValue(typeof(Unit), "")]
public virtual Unit BorderWidth
{
get
{
return this.Styles.BorderWidth;
}
set
{
this.Styles.BorderWidth = value;
}
}
/// <summary>获取或设置 Web 服务器控件的边框样式。</summary>
/// <returns>
///<see cref="T:System.Web.UI.WebControls.BorderStyle" /> 枚举值之一。默认值为 NotSet。</returns>
[DefaultValue(BorderStyle.NotSet), Category("Appearance"), Description("控件的边框样式")]
public virtual BorderStyle BorderStyle
{
get
{
return this.Styles.BorderStyle;
}
set
{
this.Styles.BorderStyle = value;
}
}
/// <summary>获取与 Web 服务器控件关联的字体属性。</summary>
/// <returns>
///<see cref="T:System.Web.UI.WebControls.FontInfo" />,表示 Web 服务器控件的字体属性。</returns>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Description("控件关联的字体"), Category("Appearance"), NotifyParentProperty(true)]
public virtual FontInfo Font
{
get
{
return Styles.Font;
}
}
/// <summary>获取或设置 Web 服务器控件的前景色(通常是文本颜色)。</summary>
/// <returns>表示控件前景色的 <see cref="T:System.Drawing.Color" />。默认值为 <see cref="F:System.Drawing.Color.Empty" /></returns>
[DefaultValue(typeof(Color), ""), Category("Appearance"), Description("控件的前景色(通常是文本颜色)"), TypeConverter(typeof(WebColorConverter))]
public virtual Color ForeColor
{
get
{
return Styles.ForeColor;
}
set
{
Styles.ForeColor = value;
}
}
/// <summary>获取或设置当鼠标指针悬停在 Web 服务器控件上时显示的文本。</summary>
/// <returns>当鼠标指针悬停在 Web 服务器控件上时显示的文本。默认值为 <see cref="F:System.String.Empty" /></returns>
[Category("Behavior"), DefaultValue(""), Description("服务器控件上时显示的文本")]
public virtual string Title//这里不要改成ToolTip,因为改成ToolTip后在我本机和Vs11里面都会造成VS直接崩溃,
{
get
{
string str = (string)this.ViewState["Title"];
if (str != null)
{
return str;
}
return string.Empty;
}
set
{
this.ViewState["Title"] = value;
}
}
public override void RenderControl(HtmlTextWriter writer)
{
if (Visible)
{
base.RenderControl(writer);
if (!Title.IsNullOrEmpty())
{
writer.AddAttribute(HtmlTextWriterAttribute.Title, Title);
}
if (!Styles.IsEmpty)
{
writer.EnterStyle(Styles, htmltag);

}
else
{
writer.RenderBeginTag(htmltag);
}

writer.RenderEndTag();
}
}



 

posted @ 2011-12-26 13:33  快乐你和我  阅读(5999)  评论(31编辑  收藏  举报