asp.net c# vb.net vc.net j#.net
返回首页
当前位置: 冰山软件站 > 程序开发 > .net > asp.net >

ASP.NET取得页面事件的发生源控件ID

时间:2009-07-02来源: 作者: 点击:
需求: ASP.NET项目,页面有基类,要求实现日志记录画面动作。 问题: 如果通过在事件的方法内指定事件发生的控件,一是给开发人员带来了负担,二是因为任何事件回发时都会走Pa

需求: ASP.NET项目,页面有基类,要求实现日志记录画面动作。

问题: 如果通过在事件的方法内指定事件发生的控件,一是给开发人员带来了负担,二是因为任何事件回发时都会走Page_Load事件,这样在日志中虽然是一次事件(当然记录的方法名是不同的),但是却分为了“页面初始化”和“按钮点击”两个事件。

解决方案: 通过客户端的HTTP请求,查询请求中是否有要求回发的控件,获得控件ID作为页面回发事件的标识。

代码如下:

Partial Public Class _DefaultClass _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Response.Write(GetEventId())
    End Sub

    Private Function GetEventId()Function GetEventId() As String

        Dim mEventId As String = String.Empty

        If IsPostBack Then
            If Not String.IsNullOrEmpty(Page.Request.Params("__EVENTTARGET")) Then
                mEventId = Page.Request.Params("__EVENTTARGET")
            Else
                For Each key As String In Page.Request.Form.AllKeys
                    If Not key.StartsWith("__") Then
                        If key.EndsWith(".x") OrElse key.EndsWith(".y") Then
                            mEventId = key.Substring(0, key.Length - 2)
                            Exit For
                        End If

                        Dim c As Control = Page.FindControl(key)
                        If TypeOf c Is Button OrElse TypeOf c Is ImageButton Then
                            mEventId = key
                            Exit For
                        End If
                    End If
                Next

            End If


            If mEventId.LastIndexOf("$") > -1 Then
                mEventId = mEventId.Substring(mEventId.LastIndexOf("$") + 1)
            End If
        Else
            mEventId = "Page_Load"
        End If

        Return mEventId
    End Function

    Protected Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub
End Class

P.S:
1.此例为自己写的一个测试代码,大家可以把此函数放到页面基类中,在基类的Page_Load方法中调用。
2.其中有“$”相关的代码是为了处理回发控件如果出现在ASP.NET AJAX容器中前面带容器组合前缀的情况,如“TabContainer1$TabPanel1$Button1”。
3.如果是GridView中的按钮,则会获得按钮的空间ID而不是GridView控件的ID,其它数据列表控件都如此。
4.如果想取得的是逻辑名,可以把逻辑名放在CommandName中,统一去取CommandName。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容