zoukankan      html  css  js  c++  java
  • GetPostBackClientHyperlink

    public class MyButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler 
        
    {
            
    public event EventHandler Click; 

            
    protected virtual void onClick(EventArgs e)
            
    {
                
    if (this.Click != null)
                
    {
                    
    this.Click(this, e);
                }

            }


            
    public void RaisePostBackEvent(string eventArgument)
            
    {
                
    this.onClick(new EventArgs());
            }
     

            
    protected override void Render(HtmlTextWriter output)
            
    {
                output.Write(
    "<input type="submit" name="{0}" value="Click Me" />",
                    
    this.UniqueID);
            }

        }


    在这段代码中我们可以看到,当用户点击这个控件时,Html元素 <input type="submit"> 会引起页面的回发,因为MyButton实现了接口 IPostBackEventHandler,因此页面回发时将调用控件的 RaisePostBackEvent 方法,从而引发我们定义的 Click 事件,这样就达到了我们引发 Click 事件的目的。需注意的是引起回发的Html元素的name属性值必须为控件的 UniqueID,否则 RaisePostBackEvent 方法不会被调用。

           这个控件的实现依赖于Html元素 <input type="submit"> 本身会引发页面的回发,如果我们要自己引起回发,则需要借助一段JavaScript,这段JavaScript可以由Page. GetPostBackClientHyperlink方法(在ASP.NET 2.0这个方法已过时,而需使用Page.ClientScript.GetPostBackClientHyperlink方法),这个方法的定义为:public string GetPostBackClientHyperlink (Control control, string argument) 。其中的参数control 为处理回发的服务器控件。argument 为传递给服务器控件的参数,也就是处理回发事件的 RaisePostBackEvent 接收到的参数eventArgument。我们可以用这种方式实现一个可以定义服务器端Click事件的超链接:
    public class MyLink : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
        
    {
            
    public event EventHandler Click; 

            
    protected virtual void onClick(EventArgs e)
            
    {
                
    if (this.Click != null)
                
    {
                    
    this.Click(this, e);
                }

            }
     

            
    public void RaisePostBackEvent(string eventArgument)
            
    {
                
    this.onClick(new EventArgs());
            }
     

            
    protected override void Render(HtmlTextWriter output)
            
    {
                output.WriteLine(
    "<a href="#" onclick="{0}">Click Me</a>",
                    
    this.Page.ClientScript.GetPostBackClientHyperlink(this""));
            }

        }  这个控件将在客户端呈现为 <a href="#" onclick="javascript:__doPostBack('ctl01','')">Click Me</a>,在点击这个超链接时将会运行JavaScrpit脚本,引起页面的回发,从而调用MyLink控件的RaisePostBackEvent方法。使用这种方式,无需将Html元素的name属性设置为UniqueID,但GetPostBackClientHyperlink方法的第一个参数必须是this。将GetPostBackClientHyperlink方法的第二个参数设为不同的值,我们可以给控件定义多种事件,在RaisePostBackEvent方法中根据eventArgument值的不同而进行不同的事件处理。argument也可以用来传递事件的数据。

           从上面我们可以看出脚本 __doPostBack('','') 将会引发控件的服务器端事件,因此我们设置可以将GetPostBackClientHyperlink方法形成的字符串传入JavaScript脚本,用eval()直接运行,从而做到客户端事件和服务器端事件的结合,实现更加复杂的功能。


    后付GetPostBackClientHyperlink应用:
       protected override void PageLoad()
            {
                string sCmd  = Page.ClientScript.GetPostBackClientHyperlink(this.cmdDelete, "0");
                if (!IsPostBack)
                {
                    string script = @"javascript:ConfirmUpdate(""Eval_message"");";
                    script = script.Replace("Eval_message", sCmd);
                    this.Btn_DeleteEMail.Attributes.Add("onclick", script);

                  }

            }
    /// <summary>
            /// 删除邮件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Btn_DeleteEMail_ServerClick(object sender, EventArgs e)
            {
                try
                {
                    if (!string.IsNullOrEmpty(HdnSelectedValues.Value))
                    {
                        string sID = HdnSelectedValues.Value.Substring(1);
                        string Delete_InBox = "Delete from InBox where ID IN (" + sID +
                                                          ") and UserCode ='" + DeptCode() + "'";
                        SqlHelper.ExecuteNonQuery(SqlHelper.CONN_STRING_NON_DTC, CommandType.Text, Delete_InBox);
                        BindThumb();
                        HdnSelectedValues.Value = string.Empty;
                    }
                    else
                        ClientScript.RegisterStartupScript(this.GetType(), "",
                            "<script language=\"javascript\"> window.alert('请选择要删除邮件!')</script>");
                }
                catch (Exception ex)
                {
                    Response.Redirect("errors.aspx?ms=" + ex.Message);
                }
            }
    html代码
     <script  type="text/javascript">
      function ConfirmUpdate(cmd)
       {
         if (ImgDispense.HdnSelectedValues.value!="")
         {
        
           if (confirm("确定要删除吗?"))
            {
              eval(cmd);
           }
        }
        else
        alert('请选择要删除邮件!');
      }
    </script>
       <input type="button"  id="Btn_DeleteEMail" runat="server"  value="删除邮件" class="input4"  />
       <asp:LinkButton ID="cmdDelete" runat="server" Visible="false" OnClick="Btn_DeleteEMail_ServerClick"></asp:LinkButton>

    这样实现了 javascript间接调用C#代码


    IPostBackDataHandler和IPostBackEventHandler冲突

    IPostBackDataHandler的LoadPostData方法先于IPostBackEventHandler的RaisePostBackEvent发生.如果只单独实现一个接口的话没有这个问题,当同时都实现这两个接口时,IPostBackEventHandler的RaisePostBackEvent方法就不执行了.

     

    网上找到了一个解决的方案,在IPostBackDataHandler的LoadPostData的方法中加入语句Page.RegisterRequiresRaiseEvent(this);

  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/chenghm2003/p/1234399.html
Copyright © 2011-2022 走看看