在ASPX脚本块中声明一个类然后在会话中存储它

时间:2011-11-20 06:13:02

标签: c# asp.net

我无法做一些我认为应该非常可行的事情。也许有人可以告诉我我错过了什么。 我被限制在服务器端脚本块(后面没有代码)中将我的C#代码添加到我的.aspx页面。我想在ASPX页面上定义一个新类(同样没有创建任何其他文件)(这将是一个嵌套类)然后在Session中存储这些对象的List以在回发之间和用户花费一些时间之后保留其他页面然后返回到有问题的页面。 这是我的代码......

    <script language="C#" runat="Server">
    protected List<Part> AssignmentSearchResults
    {
        get
        {
            if (Session["SearchResults"] == null)
                Session["SearchResults"] = new List<Part>();
            return (List<Part>)Session["SearchResults"];
        }
        set
        {
            Session["SearchResults"] = value;
        }
    }

    public class Part
    {
        public string Id { get; set; }
        public string Description { get; set; }
        public string Type { get; set; }
        public bool Selected { get; set; }
    }

</script>
(html goes here)

如果我使用List它可以正常工作,但是当我使用我的自定义类时它没有。这是我得到的错误......

  

[A] {System.Collections.Generic.List {1}} 1 [ASP.pub_usercontrols_exeplanning_resources_ascx +部分。类型A源自位于'C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0'上下文'LoadNeither'中的'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' .0__b77a5c561934e089 \ mscorlib.dll中”。类型B源自'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'在上下文'LoadNeither'位置'C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0 .0__b77a5c561934e089 \ mscorlib.dll中”。

......也许你会注意到两个(A和B)是完全相同的。 有任何想法吗?非常感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

我不知道是什么原因引起了你的问题,但我有一个解决方案。 由于会话对象无论如何都是序列化的,为什么不首先序列化对象/对象列表然后将它放入Session []?

IE:

List<Part> parts = new List<Part>();
//... populate parts
XmlSerializer xs = new XmlSerializer(typeof(List<Part>));

MemoryStream ms = new MemoryStream();
xs.Serialize(ms, parts);

// Rewind the stream and write it to session as XML

ms.Seek(0, SeekOrigin.Begin);
Session["XMLResults"] = Encoding.ASCII.GetString(ms.ToArray());

//Get memory stream from session
ms = new MemoryStream();
byte[] bData = Encoding.ASCII.GetBytes(Session["XMLResults"].ToString());
ms.Write(bData, 0, bData.Length);

// Hydrate parts list from a memory stream
ms.Seek(0, SeekOrigin.Begin);
parts = (List<Part>)xs.Deserialize(ms);