Visual Basic 8 (2005)WebFormsVisual Studio 2005.NET 2.0中级开发Visual StudioWindows.NETVisual BasicASP.NET
SQLDataSource 在 Postback 时不维护 SelectCommand 的解决方法






4.14/5 (3投票s)
本文介绍了一种解决 SQLDataSource 在回发之间无法保持最新 SelectCommand 的问题的方法。
引言
问题定义
通常,解决方法指的是临时修复方案,但我想这对于 ASP.NET 2.0 版本来说,更像是一种永久解决方案,这源于微软的安全策略。在 ASP.NET 2.0 的早期 Beta 版本中,SQLDataSource
会在回发之间保持最新的 SelectCommand
。但现在不行了。它会恢复到原始数据源创建时设置的那个,可能是在第一次 Page_Load
期间。
为什么?
这是因为 SQLDataSource
默认情况下不会将命令存储在 ViewState
中,因为现在可以在客户端解密 ViewState
,以这种方式存储敏感信息会带来一些问题。但是,在某些情况下,我们可能需要在同一页面的多次回发之间设置 SelectCommand
。
解决方法
解决方案
如果应用程序的功能优先于安全性,那么我们可以通过利用我们自己的 ViewState
来解决这个问题。
代码示例可以如下所示
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not ViewState("Button1FiredCommand") Is Nothing Then
SQLDataSource1.SelectCommand = ViewState("Button1FiredCommand")
Else
SQLDataSource1.SelectCommand = "SELECT * FROM Table1"
End If
GridView1.DataSourceID = SQLDataSource1
End Sub
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
ViewState("Button1FiredCommand") = "SELECT * FROM Table1 WHERE Column1= 'Test'"
SQLDataSource1.SelectCommand = ViewState("Button1FiredCommand")
GridView1.DataSourceID = SQLDataSource1
End Sub
此外
我们还可以启用 ViewState
的加密,以在一定程度上保护其内容。可以使用 Page.ViewStateEncryptionMode
属性来执行此操作。其默认值为 Auto
,我们需要强制将其设置为 Always
。
<%@ Page Language="VB" ViewStateEncryptionMode="Always" %>
请记住,在 Page
指令中设置的值会覆盖配置文件中设置的任何值。