Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
其中';“What’是存放定制商品的最佳地点”;“用户”;ASP.NET会话期间的对象?_Asp.net_Master Pages_Session State_Derived Class - Fatal编程技术网

其中';“What’是存放定制商品的最佳地点”;“用户”;ASP.NET会话期间的对象?

其中';“What’是存放定制商品的最佳地点”;“用户”;ASP.NET会话期间的对象?,asp.net,master-pages,session-state,derived-class,Asp.net,Master Pages,Session State,Derived Class,我有一个ASP.NET应用程序,它需要在一个会话中跨页面记住一些关于用户(以及他们来自哪个公司)的信息 我想这是任何具有一定规模的ASP.NET应用程序的要求。这些年来,我使用了几种不同的方法 过去,我在querystring参数中传递了一个id,如下所示: site.com/page.aspx?usrid=1&companyid=2 然后在每个页面上实例化对象(来自数据库) 另一种常见的方法是将对象存储在会话变量中: Session["User"] = currentUser;

我有一个ASP.NET应用程序,它需要在一个会话中跨页面记住一些关于用户(以及他们来自哪个公司)的信息

我想这是任何具有一定规模的ASP.NET应用程序的要求。这些年来,我使用了几种不同的方法

过去,我在querystring参数中传递了一个id,如下所示:

site.com/page.aspx?usrid=1&companyid=2
然后在每个页面上实例化对象(来自数据库)

另一种常见的方法是将对象存储在会话变量中:

Session["User"] = currentUser;              // store at login
User currentUser = (User)Session["User"];   // retrieve on some other page
这样就省去了访问数据库的时间,但是如果用户对象很复杂,并且站点有很多并发用户,我会担心使用的内存

我最近继承了一个在母版页上使用公共属性的应用程序,如下所示:

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page
public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}
UsernameTextBox.Text = User.FullName;
这节省了演员阵容,我觉得它更具可读性,但我不知道它在性能方面是更好还是更差。它在getter中也有一些逻辑,如果私有值为null,它会尝试从会话变量中获取它,尽管我不确定这是否从未使用过(或者每次都使用过!)

我的最新想法是使用我的page类。我有一个从标准System.Web.UI.page基类派生的自定义页面类。它包括像CurrentUser这样的对象作为公共属性。这似乎行得通。我更喜欢它

但我真的不知道封面下发生了什么。有人能就哪种方法更好以及为什么更好发表意见吗

我们也欢迎提出其他建议

更新:
我已经使用trace.axd和trace.Write进行了一些检查,看起来母版页版本和自定义页面类版本都没有“记住”页面之间的值。“get”方法有一行代码,用于检查用户属性是否为null,如果为null,则从会话变量读取该属性。当页面第一次访问给定页面上的属性(Master.User或派生类的This.User)时,就会发生这种情况,随后的请求可以获取该值(而不必访问会话变量)。

我同意您的
最新想法。让公共页面基类公开您的
user
类型的公共属性。属性应该从会话密钥读取/写入会话密钥。我们还有另一个名为GoBackPage的属性,它在当前页面的视图状态中存储上一页面的URL

    public string GoBackPage
    {
        get
        {
            return this.ViewState["__PrevPage"].ToString();
        }

        set
        {
            this.ViewState["__PrevPage"] = value;
        }
    }

您仍然可以超越此限制,只在视图状态下存储用户ID,并在公共页面基类中公开一个属性,该属性将从视图状态读取用户ID并返回用户对象。

我同意您的最新想法。让公共页面基类公开您的
user
类型的公共属性。属性应该从会话密钥读取/写入会话密钥。我们还有另一个名为GoBackPage的属性,它在当前页面的视图状态中存储上一页面的URL

    public string GoBackPage
    {
        get
        {
            return this.ViewState["__PrevPage"].ToString();
        }

        set
        {
            this.ViewState["__PrevPage"] = value;
        }
    }

您仍然可以超越此限制,只在视图状态下存储用户ID,并在公共页面基类中公开一个属性,该属性将从视图状态读取用户ID并返回用户对象。

会话正是为此目的而设计的。它存储用户“会话”生命周期内的相关数据,我认为是20分钟或用户关闭浏览器。如果您关心用户对象的大小,您可以只存储ID,然后从DB检索对象,但是您必须权衡DB往返的权衡。然而,我不认为它通常与会话有关,因为它不像ViewState那样发送到客户端。您还可以使用一个属性公开这个会话值,如好奇的Geek的示例中所示,但是使用会话对象而不是ViewState对象

在母版页上设置属性将不起作用,因为它只是当前实例化类的一个成员,在每个请求结束时会被垃圾收集,所以在下一个请求中不会有它

以下是ASP.NET中状态管理的摘要:
会话正是为了这个目的而设计的。它存储用户“会话”生命周期内的相关数据,我认为是20分钟或用户关闭浏览器。如果您关心用户对象的大小,您可以只存储ID,然后从DB检索对象,但是您必须权衡DB往返的权衡。然而,我不认为它通常与会话有关,因为它不像ViewState那样发送到客户端。您还可以使用一个属性公开这个会话值,如好奇的Geek的示例中所示,但是使用会话对象而不是ViewState对象

在母版页上设置属性将不起作用,因为它只是当前实例化类的一个成员,在每个请求结束时会被垃圾收集,所以在下一个请求中不会有它

以下是ASP.NET中状态管理的摘要:

到目前为止,最好的解决方案如下:

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page
public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}
UsernameTextBox.Text = User.FullName;
然后在任何webpage.aspx.cs上,您可以执行以下操作:

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page
public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}
UsernameTextBox.Text = User.FullName;
它将在您第一次使用它时命中会话,但在特定页面上的后续使用响应会更快


现在,各种类中的代码和后面的代码看起来更加整洁,因为我不需要每次使用会话时都从会话中读取和转换我的用户对象(和公司对象等)。

到目前为止,最好的解决方案如下所示:

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page
public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}
UsernameTextBox.Text = User.FullName;
然后在任何webpage.aspx.cs上,您可以执行以下操作:

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page
public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}
UsernameTextBox.Text = User.FullName;
它将在您第一次使用它时命中会话,但在特定页面上的后续使用响应会更快


各种类中的代码和后面的代码现在看起来更整洁,因为我不需要每次使用会话时都从会话中读取和转换我的用户对象(和公司对象等)。

将用户ID存储在ViewState中