ASP.NET 设置会话变量以控制已删除项目的显示是否有效?



我有一个填充在Page_Load上的网格。第一次显示数据库中的用户数据,不包括已删除的项目(我在数据库中有一个名为 RecordIsDeletedYN 的字段,如果设置为 true,则表示记录被删除)。所以我的Page_Load代码看起来像这样:

if(Session["ShowDeletedItems"] != null)
ShowDeletedItems = Convert.ToBoolean(Session["ShowDeletedItems"]);
else
ShowDeletedItems = false;
PopulateGrid();

我在表单顶部声明了一个页面变量:

private bool ShowDeletedItems = false;

我的想法是,第一次加载页面时,上面的代码将页面变量设置为 false。

然后Page_Load调用我的 PopulateGrid 函数。在那里,我有一个SQL查询,它是根据ShowDeletedItems bool变量的值构造的。

如果 ShowDeletedItems 为 false,则 SQL 查询中包含一条 WHERE 语句,该语句添加:

strSQL += "WHERE (RecordIsDeletedYN = 0) ";

因此,在启动时,ShowDeletedItems 是假的,因此包含 SQL WHERE,我们不会在网格中显示已删除的项目!这行得通!

我的屏幕上还有一个按钮,按下时会查看页面的状态 变量 如果它是假的,那么它会将其翻转为真,如果为假,则将其翻转为假。这是代码:

protected void imgButtShowDeleted_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
if(ShowDeletedItems)
Session["ShowDeletedItems"] = "False";
else
Session["ShowDeletedItems"] = "True";
}

此设置有效,但仅在第二次按下按钮后,此后每次按下按钮才能完美运行。

我哪里错了。 我知道这一定与页面事件的触发方式有关。我尝试将 Session 变量初始化为 Page_Init false,但当我这样做时,它永远不会显示已删除的项目。 会话变量始终设置为 false。

任何帮助都表示赞赏。

在Page.Load 事件处理程序中设置 ShowDeletedItems。根据 ASP.NET 页面生命周期,加载阶段发生在事件处理阶段之前。 因此,Page.Load事件在任何控件更改事件之前引发。

在您的情况下,Page_Load处理程序在imgButtShowDeleted_Click处理程序之前调用。因此,只有在单击按钮后进行其他回发后,您才能看到更新的数据。

若要解决此问题,请在更改 imgButtShowDeleted_Click事件处理程序中的 ShowDeletedItems 变量后重新绑定网格。

避免页面级别变量混淆...在页面上有一个 get/set 属性,该属性直接获取或设置您的会话变量...它将简化您的代码并使其不太可能出现此类问题。

还要考虑它是否只是页面,并且不需要跨新页面请求的租金......请考虑使用视图状态而不是会话。

相关内容

最新更新