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

需求: 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。



(文/RickTsuei  出处/博客园)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

Enterprise Library 深入解析与灵活应用(1)
创建基于ASP.NET的SMTP邮件服务
微软ESB产品进入.NET 3.0时代
Enterprise Library 4.0 - May 2008 发布了
.Net Compact Framework 基础篇之托管类
Visual Studio 2008加入拼写检查器
BlogEngine.Net架构与源代码分析系列part4:Blog全局设置——BlogSettings
让Java可以运行在.NET平台上的虚似机: IKVM.NET
BlogEngine.Net架构与源代码分析系列part6:开放API——MetaWeblog与BlogImporter
一种在IE中编写Mashups的新方法