不使用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>

  

  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;
        }

    }

}

  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 "你好";
        }
    }
}

时间: 2024-10-01 03:38:12

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

asp.net动态增加服务器端控件并提交表单

为什么要用原生的呢? 1.目的 原生出现浏览器兼容性问题 极少,不用测试多浏览兼容性 .需要考虑到市面上的其他垃圾浏览器. 2.性能不好 如果不考虑第一条 你可以换一种方式 直接上代码 .aspx页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-

ASP.NET服务器端控件(class0617)

ASP.Net服务端基本控件介绍 ASP.Net服务端控件是ASP.Net对HTML的封装,在C#代码中就可以用txt1.Text=‘abc’这种方式来修改input的值,ASP.Net会将服务端控件转成HTML代码输出给浏览器.服务端控件是ASP.Net非常吸引初学者.非常容易上手的东西,也是最被人诟病的东西.物尽其用,服务端控件在内网系统.互联网系统的后台部分等访问频率不高的地方用的还是很适合的. (互联网公司,产品型公司(OA)) 在服务端控件的标签中写的属性如果不是控件内置的属性就会被原

javascript获取asp.net服务器端控件的值

代码如下: <%@ Page Language="C#" CodeFile="A.aspx.cs" Inherits="OrderManage_A" %> <%@ Register Src="../UserControl/CtrlCalendar.ascx" TagName="CtrlCalendar" TagPrefix="uc1" %> <html>

ASP.NET服务器端控件和HTML控件的比较 (转)

区别:服务器端控件都会有个runat="Server"属性,这样才能够在后台对其进行修改,也就是在cs代码里面能对其进行修改.例如,当你放个HTML控件时,在CS代码中引用不出控件名,但加上runat="Server" 后在CS代码中就能引用该控件了. 其实ASP.NET 的服务器控件解析后最终返回到前台还是HTML控件.例如当你建个页面并放一个asp:textbox上去,然后运行页面,查看页面源文件就会发现放上的服务器控件变成了HTML的inupt type=&q

ASP.NET--Web服务器端控件和Html控件

今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但是现在网络硬件设施更新之快,BS 开发优势之大,不过需要的技术方面倒是得扩宽许多,JavaScript,CSS,Html都需要了解掌握,除webForm之外,对于现今主流的MVC更是需要学习. 概念: asp.net控件服务端控件  --> 响应服务端事件 HTML控件客户端控件   -- > 

ASP.NET服务器端控件原理分析

服务器端控件触发事件分两种: 1.服务器端控件Button被渲染成客户端的 <input type="submit" name="Button1" value="Button" id="Button1" /> 类型为type="submit"此类控件点击以后会通过form表单提交,点击以后会作为参数发送到服务端,参数是控件的name属性=控件的value值,服务器端会根据接收到的控件的name属

JS触发ASP.NET服务器端控件的方法

<asp:Button ID="Button_regId" runat="server" Font-Bold="False" OnClick="HistoryPushMessage_Click" Text="添加" /> $("#<%=Button_regId.ClientID%>").click(); protected void HistoryPushMess

jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值

-.获取dropdownlist的text(ddlList为服务器端dropdownlist的ID,生成name属性等于ddlList的select标签) $("#ddlList option:selected").text() 二.获取dropdownlist的value(ddlList为服务器端dropdownlist的ID,生成name属性等于ddlList的select标签) $("#ddlList").val() 三.获取radiobuttonlist的t

关于bootstrap--表单控件(disabled表单禁用、显示表单验证的样式)

1.disabled: (1)在input中加入disabled可使表单禁用,如图: <input class="form-control input-lg" id="disabledInput" type="text" placeholder="表单已被禁用,不可输入" disabled></div> (2)如果fieldset设置了disabled属性,整个域都将处于被禁用状态,如图: <fi