首页 > 代码库 > 不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。

不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。

很多时候,我们使用服务器端控件写出的代码,会给我们生成一些很多我们看不懂的代码(初学者),但是有时候我们并不需要这些代码(业务需求不同),对于生成的一些代码感到多余。所以我就开始想,有没有一种可能:不使用服务器端控件(包括form表单不加runat="server"属性)来触发后台写的某一个方法或事件(ASP.NET的事件实际上是使用事件机制来驱动的)。经过测试是可以的。

原理:使用反射驱动方法。

   步骤:

     1、手写一个提交表单的js函数(可以使用asp.net的__dopostBack函数来驱动)

   2、使用表单提交到当前这个aspx页面

   3、使用反射机制来调用指定方法

 

  aspx页面的代码:

  

技术分享
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Test.WebForm1" %><!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>    <script type="text/javascript">//<![CDATA[        function __doPostBack(eventTarget, eventArgument) {            var theForm = document.forms[form1];            if (!theForm) {                theForm = document.form1;            }            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {                theForm.__EVENTTARGET.value = eventTarget;                theForm.__EVENTARGUMENT.value = eventArgument;                theForm.submit();            }        }//]]>    </script></head><body>    <form action="WebForm1.aspx" method="post" id="form1">    <input type="hidden" name="__EVENTTARGET" value=http://www.mamicode.com/"" />    <input type="hidden" name="__EVENTARGUMENT" value=http://www.mamicode.com/"" />    <input language="javascript" onclick="__doPostBack(‘Button2‘,‘2‘)" id="Button2" type="button"        value="Button2" />    <input language="javascript" onclick="__doPostBack(‘Button1‘,‘1‘)" id="Button1" type="button"        value="Button1" />    <input language="javascript" onclick="__doPostBack(‘Button3‘,‘1‘)" id="Button3" type="button"        value="Button3" />    <a href=http://www.mamicode.com/"#" onclick="__doPostBack(‘LinkButton1‘,‘1‘)">这是LinkButton(模拟)</a>    </form></body></html>
View Code

  

  aspx.cs文件的代码

 

技术分享
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Reflection;using System.Web.Script.Serialization;namespace Test{    public partial class WebForm1 : System.Web.UI.Page    {        public WebForm1() { }        private string EventTarget        {            get            { return Request.Form["__EVENTTARGET"]; }        }        private string EventTargument        {            get            { return Request.Form["__EVENTARGUMENT"]; }        }        private new bool IsPostBack        {            get            {                if (string.IsNullOrEmpty(EventTarget) && string.IsNullOrEmpty(EventTargument))                {                    return false;                }                return true;            }        }        protected void Page_Load(object sender, EventArgs e)        {            if (!IsPostBack)            {            }            else            {                Invoke(EventTarget);            }        }        public void ss()        {            //取得MyClass的Type对象,下面的代码使用Type的静态方法需指明程序集,作用相同              //Type t = Type.GetType("Mengliao.CSharp.C13.S02.MyClass, ConsoleApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");              Type t = typeof(MyClass);            //通过Activator实例化MyClass,供实例方法调用              object obj = Activator.CreateInstance(t, new object[] { 88 });            //MethodInfo[] methods = t.GetMethods(); //获取MyClass的所有方法列表              //foreach (MethodInfo nextMethod in methods) //枚举所有方法              //{            //    Console.WriteLine(nextMethod.ToString()); //显示方法信息              //    if (nextMethod.Name == "m1") //方法m1              //    {            //        nextMethod.Invoke(obj, null); //使用obj对象调用方法m1,无参数              //    }            //    if (nextMethod.Name == "m2") //方法m2              //    {            //        //静态方法,使用null调用方法m2,建立参数数组,传入10              //        Console.WriteLine("Called static method 2, return {0}", nextMethod.Invoke(null, new object[] { 10 }));            //    }            //}            MethodInfo m3Info = t.GetMethod("Get"); //获取方法m3              m3Info.Invoke(obj, null); //调用方法m3,传入对应的2个参数              //获取方法m4,使用obj对象调用方法,无参数              //t.InvokeMember("m4", BindingFlags.InvokeMethod, null, obj, null);            ////建立泛型委托runMe,并绑定MyClass的静态私有方法m5              //Delegate runMe = Delegate.CreateDelegate(typeof(Func<double, string>), t, "m5");            //Console.WriteLine("Call delegate with m5: Sqrt(2) = {0}", ((Func<double, string>)runMe)(2)); //调用该委托              //Console.ReadLine();        }        public string Invoke(string Method)        {            Type t = typeof(MyClass);            //通过Activator实例化MyClass,供实例方法调用              object obj = null;//Activator.CreateInstance(t)            if (Session["currentObj"] == null)            {                obj = Activator.CreateInstance(t);//, new object[] { 88 }                Session["currentObj"] = obj;            }            else            {                obj = Session["currentObj"] as object;            }            MethodInfo m3Info = t.GetMethod(Method); //获取方法m3              m3Info.Invoke(obj, null); //调用方法m3,传入对应的2个参数              string name = (string)t.InvokeMember(Method, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, null);            if (!string.IsNullOrEmpty(name))            {                Response.Write("<script>alert(‘" + name + "‘);</script>");            }            return name;        }    }}
View Code

 

  MyClass.cs文件里面就是事件(方法)

  

技术分享
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;namespace Test{    public class MyClass    {        public void Button2()        {            string str1 = "1";            string str2 = "2";        }        public void Button1()        {            string str1 = "1";            string str2 = "2";        }        public string Button3()        {            return "hello world";        }        public string LinkButton1()        {            return "你好";        }    }}
View Code

 

不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。