如何在asp.net中正确使用会话参数

时间:2014-05-13 04:37:34

标签: asp.net session-variables

我甚至不确定如何使用SessionParameters而不是普通的参数。我想要做的是根据Session变量“StaffID”中的值更新或插入记录到我的数据库中,我知道它存在(基于调试PageLoad事件)。事实证明我的“StaffID”会话实际上是NULL(在详尽的调试之后找到)并且我得到了关于尝试更新具有空值的表的例外。

我的SqlDataSource因此......

 <asp:SqlDataSource ID="SqlDataProgmDetails" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                    UpdateCommand="UPDATE tblStudentProgramReg SET StaffModified = @StaffModified, DateModified = GETDATE() WHERE (ProgramEnrolmentID = @ProgramEnrolmentID)">
                    <UpdateParameters>
                        <asp:Parameter Name="EnrolmentDate" Type="DateTime" />
                        <asp:Parameter Name="StudentProgramNotes" Type="String" />
                        <asp:Parameter Name="TerminationDate" Type="DateTime" />
                        <asp:Parameter Name="StudProgEnrolStatusID" />
                        <asp:Parameter Name="QualificationCode" />
                        <asp:ControlParameter ControlID="gvPrograms" Name="ProgramEnrolmentID" Type="Int32" PropertyName="SelectedValue" />
                        <asp:SessionParameter Name="StaffModified" SessionField="StaffID" />
                    </UpdateParameters>
rs>
                </asp:SqlDataSource>

当我更新我的DetailsView时,我得到了可怕的“字符串或二进制数据将被截断。 该声明已被终止。“错误。

我知道这种情况正在发生,因为在上述SqlDataSource的UPDATE阶段,我确信一度存在的“StaffID”会话变量为NULL。

我找到的唯一方法是强制加载CodeBehind中的值...

protected void SqlDataProgmDetails_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    if (Session["StaffID"] != null)
    {
        e.Command.Parameters[5].Value = Session["StaffID"].ToString().Trim();
    }
}

protected void SqlDataProgmDetails_Inserting1(object sender, SqlDataSourceCommandEventArgs e)
{
    if (Session["StaffID"] != null)
    {
        e.Command.Parameters[8].Value = Session["StaffID"].ToString().Trim();
    }
}

但我为什么要这样做?

我原本认为StaffID应该根据我的ASP页面中的SessionParameter请求自动加载。

就像我说的那样,我不确定SessionParameters(或Session变量是如何工作的),所以如果有人可以解释为什么我必须使用codebehind来实现这一点,那将不胜感激?

谢谢

1 个答案:

答案 0 :(得分:1)

Session对象实际上是IDictionary<string, object>,它会为您保留。每个会话持续存在。当新会话开始时,客户端从服务器接收具有唯一会话标识符的cookie。

在每个后续请求中,客户端将cookie发送到服务器,并在global.asax中重新填充Session字典。因此,假设在代码隐藏中,您在用户进行身份验证时执行Session[UserId],在每个后续请求中都可以执行var UserId = Session[UserId],只要会话处于“活动”状态,您就会收到值存储

正如您所做的那样从会话中恢复值非常符合逻辑。由于HTTP是无状态的,Session是模拟状态的机制之一。