分享 ASP.NET WebForm 另外一种开发方式,逃离服务器控件
2012-06-14 18:29 音乐让我说 阅读(541) 评论(1) 编辑 收藏 举报代码源于博客:http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html
其中我修改和增加了一点点代码。废话不多说,直接贴代码了:
解决方案目录:
PageAdapter 类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Reflection; // 为了不写一堆机械式的判断代码,这里就写个简单的基类,统一处理页面的提交动作。 // 注意:代码仅做演示用,并没有过多考虑性能及安全细节。 // 代码源于博客:http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html // 现整理于此。 namespace DearBruce.CustomPageAdapter.CoreLib { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class SubmitMethodAttribute : Attribute { public bool AutoRedirect { get; set; } } internal sealed class MethodInvokeInfo { public MethodInfo MethodInfo; public SubmitMethodAttribute MethodAttribute; } public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter { public MyPageAdapter() { } private static readonly Hashtable s_table = Hashtable.Synchronized(new Hashtable()); /// <summary> /// 得到要调用的方法 /// </summary> /// <param name="type"></param> /// <returns></returns> private static MethodInvokeInfo[] GetMethodInfo(Type type) { MethodInvokeInfo[] array = s_table[type.AssemblyQualifiedName] as MethodInvokeInfo[]; if (array == null) { array = (from m in type.GetMethods(BindingFlags.Instance | BindingFlags.Public) let a = m.GetCustomAttributes(typeof(SubmitMethodAttribute), false) as SubmitMethodAttribute[] where a.Length > 0 select new MethodInvokeInfo { MethodInfo = m, MethodAttribute = a[0] }).ToArray(); s_table[type.ToString()] = array; } return array; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (Page.Request.Form.AllKeys.Length == 0) return; // 没有提交表单 Type currentType = Page.GetType(); Type baseType = currentType.BaseType; MethodInvokeInfo[] array = GetMethodInfo(baseType); if (array.Length == 0) return; foreach (MethodInvokeInfo m in array) { string actionName = Page.Request.Form[m.MethodInfo.Name]; // 得到要调用的方法,根据客户端提交按钮(input type="submit" name="btnLogin")得到 if (!string.IsNullOrEmpty(actionName)) { m.MethodInfo.Invoke(Page, null); // 这里就开始调用这个方法了 if (m.MethodAttribute.AutoRedirect && !Page.Response.IsRequestBeingRedirected) { // 说明该 Action 方法里面没有重定向操作,且该 Action 方法标记了 AutoRedirect = true Page.Response.Redirect(Page.Request.RawUrl); } return; } } } } }
Page.browser 文件:
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.Page" adapterType="DearBruce.CustomPageAdapter.CoreLib.MyPageAdapter, DearBruce.CustomPageAdapter.CoreLib" /> </controlAdapters> </browser> </browsers>
index.aspx
<%@ Page Language="C#" CodeBehind="index.aspx.cs" Inherits="DearBruce.CustomPageAdapter.WebUI.index" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <div> <fieldset> <legend>普通登录</legend> <form action="<%= Request.RawUrl %>" method="post"> 登录名:<input type="text" name="loginName" style="width: 200px" value="bruce" /> <input type="submit" name="NormalLogin" value="登录" /> </form> <br /><br /><br /> <% if (!string.IsNullOrEmpty(LoginName)) { %> <div> 您刚刚输入的登录名:<%= LoginName %> </div> <% } %> </fieldset> </div> </body> </html>
index.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using DearBruce.CustomPageAdapter.CoreLib; namespace DearBruce.CustomPageAdapter.WebUI { public partial class index : System.Web.UI.Page { protected string LoginName = null; public index() { } [SubmitMethod(AutoRedirect = false)] // 该方法处理完毕后,不自动重定向(Redirect)到本页面,而自动响应 public void NormalLogin() { // ----------------------------------------------------------------- // 注意:演示代码为了简单,这里不检查用户名与密码是否正确。 // ----------------------------------------------------------------- string loginName = Request.Form["loginName"]; if (string.IsNullOrEmpty(loginName)) { return; } LoginName = loginName; } } }
运行截图:
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。