【问题标题】:Asp.net HttpContext.Current.Items returning nullAsp.net HttpContext.Current.Items 返回 null
【发布时间】:2015-03-30 01:39:15
【问题描述】:

我正在测试构建一个 asp.net Web 应用程序。 我有 3 个网页:

Default.aspx;
Home.aspx;
ThirdPage.aspx;

当用户向 Default.aspx 提交登录数据时,我从 db 中检索用户信息,将其放入一个类中并像这样将其添加到 Context 中

HttpContext.Current.Items.Add("UserData", userData);

然后我使用 Server.Transfer 将请求发送到 Home.aspx。 在 Home.aspx 上,我有一个指向 ThirdPage.aspx 的链接。我单击此链接并希望用户信息也可以在此处获得,但事实并非如此。我希望在我的 Web 应用程序中的所有页面的用户会话中保留 userdata 类,直到用户会话过期。 有人可以指导吗? 这可能是一个初学者的问题,所以请善待。 谢谢

【问题讨论】:

标签: c# asp.net


【解决方案1】:

查看ASP.NET Session State Overview

用法:

Session["UserData"] = userData;

【讨论】:

  • 我试过这个,但是当我点击连接到 thirdpage.aspx 的链接时,会话在 thirdpage.aspx 上丢失,但是如果我执行 Server.transfer,那么会话将被保留。但我想让用户点击链接并转到网络应用程序中的另一个页面并保持其会话?
  • 嗯,我想我知道原因了。我查看了 url,当我点击链接时,url 中的会话 id 发生了变化,难怪会话为空……所以现在的问题是如何在所有页面上保留相同的会话 id,可能是用户点击链接还是通过 Server.transfer 传输?
【解决方案2】:

我不确定确切的问题可能是什么,但我有一些可行的解决方案。如果我没记错的话,您是在尝试通过几页来获取用户信息?

这里有一些方法可以完成:

  1. 重复您在第一页上执行的代码,将数据传输到 第二页并对其进行调整,使其从第二页到第二页都可以使用 第三。这可能有效,但我不会推荐,因为必须重用 并在每次创建新页面时调整代码。
  2. 我认为更好的方法是将您的信息写入 XML 文件并在会话到期时删除该文件。 你可以找到如何写它here和阅读它here
  3. 但我个人最喜欢的是有一个静态类。静态类可以从任何地方访问。如页面here所示。

    公共静态类全局

    {
        public static String name; 
        public static int age;
    
        public void SetName(){...}
        public void SetAge(){...}
        public String GetName(){...}
        public int GetName(){...}
    }
    
    • 只要把它做成一个可变类(你可以使用函数改变变量),应该很容易跨页面获取用户信息。

      1. 这里使用 JSON 保存和加载是 c# 函数:

    public void SaveInfo(User user){

    //转换为Json string json = JsonConvert.SerializeObject(user, Formatting.Indented);

    //Write to file, you will have to create a file serverside if you want
    //if you have a 
    File.WriteAllText(@"location.json", json);
    

    }

    公共无效负载用户(){ 使用 (StreamReader r = new StreamReader("Location.json")) { 字符串 json = r.ReadToEnd(); 列表项 = JsonConvert.DeserializeObject>(json); }

【讨论】:

  • 谢谢,第三个选项是我正在考虑的选项,但是我很困惑,因为我只想为他们的会话保留用户信息,一旦会话结束,用户数据也应该保留。 .这将是一个很好的解决方案,请多指导一点。谢谢
  • 好的,我发现了我的问题,我使用了 HttpContext.Current.Session 而不是 Items,它似乎已经奏效了。我点击这个作为我的答案,因为上面提供的第三个选项正是我所期待的,即使我的实现完全不同。非常感谢您的指导
  • 没问题,我可以帮忙。我实际上正在添加第四步,并将在上面编辑我的代码。它使用 JSON,非常简单。
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多