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



我在做一件我认为应该非常可行的事情时遇到了麻烦。也许有人能告诉我我错过了什么。我只能将c#代码添加到服务器端脚本块中的.aspx页面中(后面没有代码)。我想在ASPX页面上定义一个新类(再次不创建任何其他文件)(这将是一个嵌套类),然后在Session中存储这些对象的列表,以便在回发之间和用户在其他页面上花费一些时间后持续存在,然后返回到有问题的那个。这是我的代码…

    <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,它工作得很好,但是当我使用我的自定义类时,它不工作。这是我得到的错误…

System.Collections.Generic。列出1[ASP.pub_usercontrols_exeplanning_resources_ascx+Part] cannot be cast to [B]System.Collections.Generic.List 1[ASP.pub_usercontrols_exeplanning_resources_ascx+Part]。类型A源自"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"上下文中的"LoadNeither",位于位置"C:WindowsMicrosoft.NetassemblyGAC_32mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dll"。类型B源自'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'上下文中的'LoadNeither'在位置'C:WindowsMicrosoft.NetassemblyGAC_32mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dll'.

…也许你会注意到两者(A和B)是完全相同的。什么好主意吗?非常感谢您的帮助。

我不知道是什么导致你的问题,但我有一个解决方案。既然会话对象正在被序列化,为什么不先序列化对象/对象列表,然后把它放到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);

相关内容

最新更新