你可以处理Select、Update、Insert、Delete和Filter的事件,以验证并处理传递给这些操作的参数值。为了达到这个目标,数据绑定的控件和数据源控件都暴露了适当的事件。例如,在GridView的Updating事件中,你就可以看到Keys、NewValues和OldValues字典中的参数名称和值,而它们将会被传递到数据源。在数据源一端,你可以处理SqlDataSource的Updating事件,看到这些应用到下层命令对象的参数,而这些命令将会执行以完成相关操作。类似的,你可以处理ObjectDataSource的Updating事件来查看或改变参数字典,而这些字典将用于分析UpdateMethod的适当操作。你可以使用这些事件来增加或删除字典或命令的参数、改变它们的值、或者简单地验证参数的输入格式是否正确。
请注意:你尤其需要验证Filtering事件的参数输入,因为在它应用到相关的DataView对象的FilterExpression(过滤器表达式)之前不会获得SQL编码(encoded)。
下面的示例演示了处理多个数据控件的事件来枚举那些通过事件参数传递的参数集合。请注意,这个示例把与OrderID主键字段相关联的绑定字段的InsertVisible属性设置为假,这是因为在下层数据库中OrderID是一个标识列,不应该传递给Insert操作(当插入发生的时候数据库自动地增加这个值)。同时请注意,在DataKeyNames中,OrderID字段被标记为主键,因此这个字段的原始值保留在数据绑定控件所传递的Keys字典中。用户输入控件的值都传递进NewValues字典(除了那些标记了ReadOnly=false的字段)。非键字段的原始值由数据绑定控件保留在OldValues字典中,以供传递给数据源。这些参数值都被SqlDataSource按照NewValues、Keys和OldValues的次序附加到命令上,尽管在默认情况下,当ConflictDetection被设置为OverwriteChanges的时候,数据源不会附加OldValues。你可以在后面的"使用冲突检测"部分看到数据源是如何使用OldValues的。
<script runat="server">
Protected Sub EnumerateDictionary(ByVal dictionary As System.Collections.Specialized.IOrderedDictionary)
Dim entry As DictionaryEntry
For Each entry In dictionary
Response.Write(" <b>" & Server.HtmlEncode(entry.Key) & "</b>=" & Server.HtmlEncode(entry.Value) & " (" & Server.HtmlEncode(entry.Value.GetType().Name) & ")<br />")
Next
End Sub
Protected Sub EnumerateCommandParameters(ByVal command As System.Data.Common.DbCommand)
Response.Write("<br/>Parameter order in data source<br />")
Dim param As System.Data.Common.DbParameter
For Each param In command.Parameters
Response.Write(" <b>" & Server.HtmlEncode(param.ParameterName) & "</b>=" & Server.HtmlEncode(param.Value) & " (" & Server.HtmlEncode(param.Value.GetType().Name) & ")<br />")
Next
End Sub
Protected Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpd