拼吾爱程序人生

首页 » .Net编程 » Visual Studio.NET » 取得页面事件的发生源控件ID
cobra - 2008-8-16 8:13:00
需求: 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] 的这些文章也感兴趣:

Attribute在.net编程中的应用(一)
Attribute在.net编程中的应用(二)
Java、.NET,为什么不合二为一?
.NET 框架中的 Factory 模式
.NET和JAVA的跨平台,程序员很期望
.NET还是JAVA,一个中国程序员的评论
NBearMapping - 开源通用对象映射组件v1.0.0.0 beta
ObjectBuilder中WeakRefDictionary使用模式浅析
面向对象的应用服务层设计
Sending email with an embedded image through ASP.NET
邮件发送类,支持HTML格式,支持优先级设置
使用.NET发送邮件
1
查看完整版本: 取得页面事件的发生源控件ID
Modify by pin5i DZNT_ExpandPackage 2.1.3296 2007-2009 pin5i.com
 Total Unique Visitors: