• 不使用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="" />
        <input type="hidden" name="__EVENTARGUMENT" value="" />
        <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="#" 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
  • 相关阅读:
    Docker镜像仓库的搭建--> Harbor篇
    K8S入门系列之扩展组件 --> Dashboard (五)
    K8S入门系列之必备扩展组件--> coredns(四)
    K8S入门系列之集群二进制部署--> node篇(三)
    K8S入门系列之集群二进制部署--> master篇(二)
    K8S入门系列之集群yum安装-->初试篇(一)
    zabbix 4.2 的安装和设置(mysql57----centos7)
    SVN--服务端安装和设置---centos7
    Docker(二) Dockerfile 使用介绍
    二叉搜索树JavaScript实现
  • 原文地址:https://www.cnblogs.com/goesby/p/4178326.html
Copyright © 2020-2023  润新知