【问题标题】:Method to access/set a session object in C# .net在 C# .net 中访问/设置会话对象的方法
【发布时间】:2011-04-01 09:55:54
【问题描述】:

我目前有以下代码:

public MyObject SessionStore
{
    get
    {
        if (Session["MyData"] == null)
            Session["MyData"] = new MyObject();

        return (MyData) Session["MyData"]; 
    }

    set 
    { 
        Session["MyData"] = (MyObject) value; 
    }
}

我使用SessionStore.ThePropertyIWant访问它

我使用SessionStore = SessionStore设置它

这行得通;但是有没有更好的方法来完成同样的事情?

【问题讨论】:

    标签: c# .net session accessor


    【解决方案1】:

    你不需要在setter中进行强制转换,并且可以使getter更简洁:

    public MyData SessionStore
    {
        get { return (MyData)(Session["MyData"]) ?? new MyData(); }
        set { Session["MyData"] = value; }
    }
    

    【讨论】:

    • 使用 ??并不总是一个好主意。我使用了一段时间,直到我将 List 作为属性添加到会话中。然后,每当我调用该属性来添加一个项目时,总是会返回一个新的 emtpy 列表。如果您对此有解决办法,请告诉我!
    • “你不需要在 setter 中强制转换” - re-sharper 同意 ;)
    • @WraithNath :我喜欢将它用于这样的简单情况。就像“?”运营商,你不能过度使用它;)
    • @mathieu - 是的,我也是 :) 只是我会提到它,以防有人尝试使用列表并想知道为什么项目不会添加到它!
    • @WraithNath - 听起来问题出在代码的其他地方,而不是 ??运营商本身。
    【解决方案2】:

    SessionStore 很好,但你最终可能会得到很多属性。我倾向于将受保护的属性添加到基础库并从那里访问。

    例如:

    /// <summary>
    /// Gets or Sets the Current Order Line
    /// </summary>
    protected OrderLine CurrentOrderLine
    {
        get
        {
            if (Session["CurrentOrderLine"] == null)
            {
                Session["CurrentOrderLine"] = new OrderLine(this.CurrentOrder);
            }
    
            return Session["CurrentOrderLine"] as OrderLine;
        }
        set
        {
            Session["CurrentOrderLine"] = value;
        }
    }
    

    如果您继承它,它将在您的页面上显示为属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-03
      • 2013-08-26
      • 2014-07-04
      • 1970-01-01
      • 2019-01-31
      • 2019-08-29
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多