65.9K
CodeProject 正在变化。 阅读更多。
Home

SQLDataSource 在 Postback 时不维护 SelectCommand 的解决方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (3投票s)

2007年9月17日

CPOL

1分钟阅读

viewsIcon

28859

本文介绍了一种解决 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 指令中设置的值会覆盖配置文件中设置的任何值。

© . All rights reserved.