快速业务通道

领先技术: 子类化和重写ASP.NET页面 - 第II部分

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-03
stData 返回 true 时才会调用 RaisePostDataChangedEvent 方法。

图 4 显示的伪代码显示了为 System.Web.UI.WebControls.TextBox 控件实现 LoadPostData 方法。基本上,该方法可将读取自视图状态的 Text 属性的值与已发布值进行比较。如果两个值不同,则已发布值将替换当前值,并成为控件 Text 属性的新值。

Figure 4 TextBox 控件的 LoadPostData 方法

Protected Overridable Function LoadPostData(ByVal postDataKey As?String, _
   ByVal postCollection As NameValueCollection) As Boolean
  MyBase.ValidateEvent(postDataKey)
 
  Dim oldText As String = Me.Text
  Dim newText As String = postCollection.Item(postDataKey)
 
  If (Not Me.ReadOnly AndAlso Not oldText.Equals( _
     newText, StringComparison.Ordinal)) Then
   Me.Text = newText
   Return True
  End If
  Return False
End Function

如您所见,已发布的值被盲目地分配给 Text 属性,而并未充分考虑字符串的长度。通过 LoadPostData 方法,每个控件都可以更新所需数量的属性,并且可以交叉检查对测试有意义的所有属性。如图 4 所示,TextBox 实现 LoadPostData 方法,限制了验证,使其只能确保控件为非只读,进而对新旧文本进行比较。

图 5 所示为一个全新的 TextBox 控件,其 LoadPostData 方法的实现稍有不同。重写的方法只是先将已发布文本截断至允许的最大长度,然后再进行文本比较。如图 6 所示,任何超过最大长度的文本都会被自动截断,因此在回发过程中不会再用于生成更长的结果。无论客户端浏览器的功能如何,都会出现这种情况。

Figure 5 经过修改的 TextBox 的 LoadPostData 方法

Public Class TextBox : Inherits System.Web.UI.WebControls.TextBox
Protected Overrides Function LoadPostData( _
ByVal postDataKey As String, _
ByVal postCollection As NameValueCollection) As Boolean
Page.ClientScript.ValidateEvent(Me.UniqueID, String.Empty)
Dim oldText As String = Me.Text
Dim newText As String = postCollection.Item(postDataKey)
If (newText.Length > Me.MaxLength) Then
newText = newText.Substring(0, Me.MaxLength)
End If
If (Not Me.ReadOnly AndAlso Not oldText.Equals( _
newText, StringComparison.Ordinal)) Then
Me.Text = newText
Return True
End If
Return False
End Function
End Class

领先技术: 子类化和重写ASP.NET页面 - 第II部分

图 6 超过最大长度的文本会被“截断”

仔细比较图 4 和图 5 中 LoadPostData 方法的源代码,您就会发现一个细微的差别。在图 4 中,方法在其基类(System.Web.UI.Control 类)上调用至 ValidateEvent。在图 5 中,同一代码是通过调用 ClientScriptManager 对象上的 ValidateEvent 而被替换的:

Page.ClientScript.ValidateEvent(Me.UniqueID, String.Empty)

由于 Control 基类上的 ValidateEvent 方法是声明为 Friend(在 C# 内部),因此从 System.Web.dll 程序集之外定义的任何类是无法调用它的。Control 基类上的 ValidateEvent 方法的调用堆栈最终会调用 ClientScriptManager 对象上的 ValidateEvent 方法;ClientScriptManager 对象的实例则通过 Page 类的 ClientScript 属性得以公开。

ValidateEvent 是 ASP.NET 2.0 中可用于实现事件验证的一个工具。事件验证是一项内置功能,旨在避免页面处理那些不是由页面和已注册控件专门生成的事件(和事件参数)。

替换 TextBox 控件

经过一些列操作,现在您获得了一个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号