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

  • 相关阅读:
    jQuery 获取 select 值和文本
    js 获取字符串中最后一个斜杠后面的内容
    asp.net web.config 经典模式和集成模式相关配置
    IIS8 web.config 重定向之后 报错 500.19
    nodeJs学习-06 模块化、系统模块、自定义模块、express框架
    nodeJs学习-05 案例:http/fs/querystring/url
    nodeJs学习-04 POST数据请求,分段发送,分段接收
    nodeJs学习-03 GET数据请求,js拆解/querystring/url
    nodeJs学习-02 fs模块(文件操作)
    nodeJs学习-01 http模块
  • 原文地址:https://www.cnblogs.com/chenghm2003/p/1234399.html
Copyright © 2011-2022 走看看