领先技术: 子类化和重写ASP.NET页面 - 第II部分
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 图 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |