目的:一个链接控件<a>,想让它有引发事件功能。过程:
1。查看linkbutton,在html页面会有_dopost 和2个隐藏的input
2。了解自定义控件的事件引发概念
3。一下子没可能搞的太清__EVENTTARGET在.net内部工作过程。
4。所以自己模拟生成js代码控件cs:using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
namespace controla
{
    public class Class1 : Control, IPostBackEventHandler
    {
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<a href='javascript:" + this.UniqueID + "_doPost(" + this.UniqueID + ")' name='" + this.UniqueID + "'>apost</a>");
            base.Render(writer);
        }        public delegate void EventPageIndex(Object sender, EventArgs e);        public event EventPageIndex PageChange;  //页更改事件        public virtual void HEREPageChange(Object sender, EventArgs e)
        {
            if (PageChange != null)
            {
                PageChange(this, e);
            }        }        public void RaisePostBackEvent(string eventArgument)
        {
            int i = 9;
            HEREPageChange(this, new EventArgs());
            //this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString());
            //PageArgs e = new PageArgs();
            //e.CurPage = CurPage;
            //OnPageChange(this, e);
        }        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            string dopost = "<div>\n";
            dopost += "   <input type=\"hidden\" name=\"" + this.UniqueID + "\" id='" + this.UniqueID + "' value=\"\" />\n";
            dopost += "</div>\n";
            dopost += "<script type=text/javascript>\n";
            dopost += "      function " + this.UniqueID + "_doPost(cutomArg){\n";
            dopost += "          document.forms['form1']." + this.UniqueID + ".value = cutomArg;\n";
            dopost += "          document.forms['form1'].submit();\n";
            dopost += "      }\n";
            dopost += "</script>\n";
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.UniqueID, dopost);
        }
    }
}aspx:<body>
    <form id="form1" runat="server" method="post">
    <div>
        <cc1:Class1 ID="Class1_1" runat="server" OnPageChange="tt">
        </cc1:Class1>
        &nbsp;&nbsp;<cc1:Class1 ID="Class1_2" runat="server" OnPageChange="tt2">
        </cc1:Class1>
    </div>
    </form>
</body>
aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;namespace fffff
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Response.Write("first");
            }
            else
            {                Response.Write("second");
            }
        }        protected void tt(object sender, EventArgs e)
        {
            Response.Write("fire!");
        }        protected void tt2(object sender, EventArgs e)
        {
            Response.Write("fire2!");
        }
    }
}结果:页面拖2个控件,可是不管点哪个都只能引发  tt2 这个目标函数。希望说说怎么解决呢?
不在我的代码上修改也可以,只要能解决,多个连接引发各自的事件就可以。
但是因为我的实际需要原因控件类不要继承linkbutton。只要继承 Control, IPostBackEventHandler这2个类。
请解答。谢谢。

解决方案 »

  1.   

     try:writer.Write(" <a href='javascript:"+this.GetPostBackEventReference(this,"")  + "'>apost </a>"); 
      

  2.   

     public class Class1 : Control, IPostBackEventHandler
        {
            protected override void Render(HtmlTextWriter writer)
            {
               // writer.Write(" <a href='javascript:" + this.UniqueID + "_doPost(" + this.UniqueID + ")' name='" + this.UniqueID + "'>apost </a>");
                writer.Write(" <a href=\"javascript:" +this.Page.ClientScript.GetPostBackEventReference(this,"")   + "\">apost </a>"); 
                base.Render(writer);
            }        public delegate void EventPageIndex(Object sender, EventArgs e);        public event EventPageIndex PageChange;  //页更改事件         public virtual void HEREPageChange(Object sender, EventArgs e)
            {
                if (PageChange != null)
                {
                    PageChange(this, e);
                }        }        public void RaisePostBackEvent(string eventArgument)
            {
                
                int i = 9;
                HEREPageChange(this, new EventArgs());
                //this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString()); 
                //PageArgs e = new PageArgs(); 
                //e.CurPage = CurPage; 
                //OnPageChange(this, e); 
            }        protected override void OnPreRender(EventArgs e)
            {
                base.OnPreRender(e);
                //string dopost = " <div>\n";
                //dopost += "  <input type=\"hidden\" name=\"" + this.UniqueID + "\" id='" + this.UniqueID + "' value=\"\" />\n";
                //dopost += " </div>\n";
                //dopost += " <script type=text/javascript>\n";
                //dopost += "      function " + this.UniqueID + "_doPost(cutomArg){\n";
                //dopost += "          document.forms['form1']." + this.UniqueID + ".value = cutomArg;\n";
                //dopost += "          document.forms['form1'].submit();\n";
                //dopost += "      }\n";
                //dopost += " </script>\n";
                //Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.UniqueID, dopost);
            }
        } 
      

  3.   

    采用这种的话,生成.net规定的js提交代码。但是却引发不了RaisePostBackEvent这个方法。html代码是这样的:<html xmlns="http://www.w3.org/1999/xhtml" >
    <head><title>
    无标题页
    </title></head>
    <body>
        <form name="form1" method="post" action="default.aspx" id="form1">
    <div>
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA2NjM0NTAwMGRkxa9KCfTPbvgCZdCDarnFIyug5yQ=" />
    </div>    <div>
             <a href='javascript:__doPostBack('Class1_1','tt')' name="Class1_1">apost </a>
            
            &nbsp;&nbsp; <a href='javascript:__doPostBack('Class1_2','tt')' name="Class1_2">apost </a>
            
        </div>
        
    <div> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    </div>
    <script type="text/javascript">
    <!--
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    // -->
    </script></form>
    </body>
    </html>
      

  4.   

    cpp2017
    谢谢。你的方法是可以的。
    但是为什么我在这里
    writer.Write(" <a href='javascript:"+this.GetPostBackEventReference(this,"")  + "'>apost </a>"); 
    加上了
    name='" + this.UniqueID + "'
    却不引发了了?
      

  5.   

    大概知道了。input type 的submit类型需要name才能引发事件。
    其他类型就不需要了。js的__doPostBack(eventTarget, eventArgument) 包含了控件id。
    谢谢。
    结帖。