【问题标题】:How to properly use Session Parameters in asp.net如何在 asp.net 中正确使用会话参数
【发布时间】:2014-05-13 04:37:33
【问题描述】:

我什至不确定 SessionParameters 与普通参数相比是如何使用的。我要做的是根据我知道存在的会话变量“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 时,我得到了可怕的“字符串或二进制数据将被截断。 语句已终止。”错误。

我知道这种情况正在发生,因为我确信在某一时刻存在的“StaffID”会话变量在上述 SqlDataSource 的 UPDATE 阶段为 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 变量)一般是如何工作的,所以如果有人可以解释为什么我必须使用代码隐藏来让它工作,那将不胜感激?

谢谢

【问题讨论】:

    标签: asp.net session-variables


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢埃拉德。所以你的意思是,像我上面在代码隐藏中所做的那样恢复我的会话变量实际上是唯一的方法,因此它是合乎逻辑且可以接受的?
    • 是的,这种用法是WebForms 故事的重要组成部分。这正是会话的设计目的。
    • 感谢埃拉德。你的答案就是这样。
    猜你喜欢
    • 2020-03-04
    • 2012-10-27
    • 2019-09-24
    • 2015-07-27
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2016-07-28
    相关资源
    最近更新 更多