【问题标题】:How to prevent a property in class not to store in session如何防止类中的属性不存储在会话中
【发布时间】:2014-05-06 07:48:33
【问题描述】:

假设我有复杂的类

class Complex
{
    public ClassA A { get; set;}

    public ClassB B { get; set;}

    public string prop1 { get; set;}

    public string prop2 { get; set;}
}

现在我想将此对象存储在会话中。我可以用下面的语句来做。

var complexObj = new Complex { 
// Initialize the proerties here.
}

Session["ComplexObj"] = complexObj;

现在,我不想在会话中存储 Class A 对象(因为我们不在任何地方管理此值。)。谁能告诉我如何在不更改现有课程的情况下做到这一点。

我们可以为该特定属性提供类似data annotations 的内容吗?

类似的东西

[NoSession]
public ClassA A { get; set;}

请帮帮我。

【问题讨论】:

  • 在 MVC 中没有开箱即用的东西。但是,您可以对 Session 对象进行包装以达到预期的效果。它将创建一个相同类型的新对象,复制基础属性值并为标记有该属性的属性设置默认值。您需要复制初始对象,因为非原始值是通过引用传递的。
  • 复制对象的一种简单方法是对其进行序列化和反序列化。

标签: .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

您必须使用 NonSerialized 属性,但不要使用 auto 属性。声明一个私有变量并使其成为 NonSerialized 并在公共财产中使用它.. 旧方式..

[非序列化]
私有#dataType# _obj;

公共#dataType# Obj { 得到 { 返回 _obj; } 设置 { _obj= 值; } }

【讨论】:

  • 嘿,ravindra,有什么不使用自动属性的具体原因吗?谢谢:)
【解决方案2】:

没办法,如果你将null设置为A属性会更好,例如:

public Complex MyComplex
{
    get
    {
        return Session["ComplexObj"] as Complex
    }
    set
    {
        value.A = null; // set A to null
        Session["ComplexObj"] = value;
    }
}

另一方面,您可以将对象序列化为 Stream 并将此对象应用于会话,但您应该反序列化以读取(在这种情况下,您可以应用 NonSerialized 属性来忽略序列化过程,示例:

在您的 Complex 类中,您可以为您不想序列化的属性添加 NonSerialized 属性:

class Complex
{
    [NonSerialized]
    public ClassA A { get; set;}

    public ClassB B { get; set;}

    public string prop1 { get; set;}

    public string prop2 { get; set;}
}

实现一些序列化辅助方法以序列化到内存流中

public static MemoryStream SerializeToStream<T>(T o)
{
    MemoryStream stream = new MemoryStream();
    IFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, o);
    return stream;
}

public static T DeserializeFromStream<T>(MemoryStream stream)
{
    IFormatter formatter = new BinaryFormatter();
    stream.Seek(0, SeekOrigin.Begin);
    T o = (T)formatter.Deserialize(stream);
    return o;
}

并使用辅助方法创建一个属性来封装Complex 对象。

public Complex MyComplex
{
    get
    {
        if (Session["ComplexObj"] != null)
        {
            return DeserializeFromStream<MyComplex>((MemoryStream)Session["ComplexObj"]);
        }
        return null;
    }
    set
    {
        Session["ComplexObj"] = SerializeToStream(value);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2017-06-11
    • 2014-09-10
    • 2018-04-02
    • 2019-05-31
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多