我甚至不确定如何使用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来实现这一点,那将不胜感激?
谢谢
答案 0 :(得分:1)
Session
对象实际上是IDictionary<string, object>
,它会为您保留。每个会话持续存在。当新会话开始时,客户端从服务器接收具有唯一会话标识符的cookie。
在每个后续请求中,客户端将cookie发送到服务器,并在global.asax
中重新填充Session
字典。因此,假设在代码隐藏中,您在用户进行身份验证时执行Session[UserId]
,在每个后续请求中都可以执行var UserId = Session[UserId]
,只要会话处于“活动”状态,您就会收到值存储
正如您所做的那样从会话中恢复值非常符合逻辑。由于HTTP是无状态的,Session
是模拟状态的机制之一。