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(); } }
转载于:https://www.cnblogs.com/happyyouandme/archive/2011/12/26/2301907.html
asp.NET去掉form的runat=server照样使用服务器控件,包括表单的服务器控件相关推荐
- input type=button与asp:button的区别,以及runat=server的作用
<input type="button">与<asp:button>的区别,以及runat="server"的作用 在<input ...
- ASP.NET中使用script runat=server
ASP.NET中使用<script runat="server"> 标签: asp.netserver服务器objectasp 2012-04-11 09:46 475 ...
- ASP.NET中aspx页面runat=server的本质(Essensial of runat=”server” in ASP.NET)
今天同事问我一个"神奇"的问题,另一个同事"神奇"地找出了问题但无法解释,归咎于一种"习惯"或者"下次注意".现在我把问 ...
- Form中runat=server属性的意义
运行编译aspx文件时,无runat server属性的标签直接写入Response:有runat server属性的标签,将被转换为HtmlContrl控件加入到ASP.NET自带的控件集合中. 用 ...
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...
- 处理ajax表单验证结果,使用 jQuery Form 插件完成带数据验证的 Ajax 表单
表单提交之前,一般我们要在前端对表单的输入值做一些基本验证,以避免恶意提交,并提高安全性.我们可以通过两个 jQuery 插件实现这两个功能:Malsup's AjaxForm 和 Bassistan ...
- html中用form单选框右侧提示汗字,HTML表单(Forms)解析
HTML表单(Form)是HTML的一个重要部分,主要用于采集和提交用户输入的信息. 举个简单的例子,一个让用户输入姓名的HTML表单(Form).示例代码如下: 请输入你的姓名: 01. 02. 输 ...
- form标签的action之前 加密_HTML从零开始——表单标签
网页发展的过程中,总还是需要和用户互动的,尤其是需要个人信息.注册账号.处理事务等等的时候,用户要按照网站规定的格式来填写信息,这就需要表单了. 表单(form)是用户输入信息与网页互动的一种形式.大 ...
- html下拉列表自动打开,Html form select下拉列表菜单与跳转菜单表单标签篇
Html form select下拉列表菜单与select跳转菜单表单标签案例教程 一.Form select语法与结构: - TOP DIVCSS5 DIVCSS5 二.Form selec ...
最新文章
- 【ACM】杭电OJ 2020(排序)
- 【架构】阿里中台内容整理(部分)
- android引用另一个项目作为library错误
- 工作流Activiti5.13学习笔记(一)
- Python+VSCode是我的心头爱,飞一般的Coding体验!
- php apd,PHP debug 工具 之 APD
- 实时视频流(url)——延时显示
- python自动化接口测试excel脚本_python+requests+excel 实现接口自动化测试
- 知识点1--认识SSM框架并准备项目
- 三、基础的Serializer序列化器
- k8s的优势和部署模式
- 模具工业及其发展趋势
- Java经典代码工具类2
- 用javaScript制作爱心特效
- 活久见!西电毕设门处理结果:只让肇事者延毕一年、取消保研
- 雷军回顾20年前自己的“程序人生”,还用吴奇隆的歌词文艺了一把
- 举个栗子~Tableau 技巧(215):简化实现雷达图(Radar Chart)
- 给hacke拨乱反正 黑客、红客、蓝客究竟是什么
- 铝阳极封孔废水除镍树脂CH-90
- 【linux驱动开发】i2c驱动框架之温湿度传感器htu21d
热门文章
- spring_restful_json_jdbc
- Fastjson反序列化泛型类型时候的一个问题
- SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
- Android 简介:Android SDK 和开发框架简介
- silverlight 学习笔记 (七):Prism的第一个应用
- screen 用法汇总
- 内存分配知识:全局,局部,静态变量
- 另一个.NET上的文档数据库Raven[转载]
- 安装python扩展库时只能使用pip_使用pip安装Python扩展库的方法
- url存在宽字节跨站漏洞_【XSS漏洞】XSS漏洞相关总结v1.0