在会话状态中存储复杂对象

5
我在我的.NET项目的App_Code文件夹下有一个名为“StateBag.cs”的单独类。
代码如下:

using System; using System.Text;

[Serializable()]
public class MyStateBag
{
    public MyStateBag(){}
    private string _MemberID = string.Empty;
    public string MemberID
    {
        get { return _MemberID; }
        set { _MemberID = value; }
    }
}

现在我希望能够从我的网站项目的任何页面更新MemberID值。
例如:
Default.aspx.cs:
  public partial class _Default : System.Web.UI.Page
  {
    public StateBag MyStateBag
    {
        get { return (StateBag)Session["MyStateBag"]; }
        set { Session["MyStateBag"] = value; }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        this.MyStateBag = (StateBag)Session["MyStateBag"];
    }

    .... }

在我的Default.aspx.cs页面上,我正在尝试将memberID的值设置为MyStateBag:

 if (HttpContext.Current.Session["MyStateBag"] == null)
        {
            HttpContext.Current.Session["MyStateBag"] = new StateBag();
        }
        ((StateBag)HttpContext.Current.Session["MyStateBag"]).MemberID = memID;

然而,我遇到了一个冲突: 'System.Web.UI.StateBag' 不包含 'MemberID' 的定义,并且没有接受类型为 'System.Web.UI.StateBag' 的第一个参数的扩展方法 'MemberID' 可用(您是否缺少使用指令或程序集引用?) 我在 Default.aspx.cs 页面上漏掉了某些引用吗?
如何访问并返回它呢...比如说我在另一个页面 "About.aspx.cs" 上。
我想能够这样说:- memberinfo = StateBag["MemberID"] 有人能帮我理解这个问题吗?

注意:视图状态不是会话状态,几乎总是与特定页面相关联(或者说,它存在于生成的HTML中,并在服务器端重新构建)。要在不同页面之间保持状态,请考虑使用会话状态(既然使用了会话,为什么要标记ViewState?)、Cookies或将状态编码到页面URI中。 - user2864740
太好了!那请给我一些示例代码吧? - Philo
我尝试过这个,但我的值没有被保存: //HttpContext.Current.Session["memID"] = memID; //string memberinfo = string.Empty; //memberinfo = HttpContext.Current.Session["memID"].ToString(); - Philo
这是一个ASP.NET网站“项目”(文件->新建网站或添加->新建网站),还是一个ASP.NET Web应用程序项目(文件->新建项目或添加->新建项目)?就代码文件而言,这是有区别的。 - John Saunders
@JohnSaunders 这是一个网络应用程序。 - Philo
1个回答

3

任何保存在Session对象中的内容都会随着用户在网站上的浏览而保留。因此,在Default.aspx.cs页面中,您可能会有类似以下的内容:

//Make sure there is an object saved for this user
if(Session["StateBag"] == null)
   Session["StateBag"] = new StateBag();

//Set what you need
((StateBag)Session["StateBag"]).MemberID = 1234;

然后在另一页上,您可以以相同的方式访问它。
//Make sure there is an object saved for this user
if(Session["StateBag"] == null)
   Session["StateBag"] = new StateBag();

//Get what you need
int memberID = ((StateBag)Session["StateBag"]).MemberID

1
我敢打赌,你定义的StateBag类与System.Web.UI.StateBag类混淆了。尝试将你的StateBag重命名为其他独特的名称。 - JerSchneid
所以我将StateBag.cs更改为MyStateBag.cs,其余代码现在都引用MyStateBag.cs。仍然存在相同的冲突。如果您愿意再次查看,我已更新了我的代码。 - Philo
你必须将其转换为MyStateBag,而不是StateBag,因为StateBag没有MemberID属性。 - Lee O.
1
((StateBag)HttpContext.Current.Session["MyStateBag"]).MemberID = memID; 需要改为 ((MyStateBag)HttpContext.Current.Session["MyStateBag"]).MemberID = memID; - Lee O.
谢谢Lee,现在我遇到一个新的错误,它说:“_Default.MyStateBag”是一个“属性”,但被用作“类型”。 - Philo
所以我犯了一些错误,正如Lee所说,我需要在所有的Default.aspx.cs代码中引用MyStateBag而不是StateBag。此外,我解决类型问题的方法是右键单击MyStateBag.cs类并将属性从内容设置为编译。由于这是一个对象,它必须是预编译的,而不是作为内容处理。 - Philo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接