在ASPX脚本块中声明一个类,然后将其存储在会话中
本文关键字:会话 然后 一个 存储 脚本 ASPX 声明 | 更新日期: 2023-09-27 18:15:10
我在做一件我认为应该非常可行的事情时遇到了麻烦。也许有人能告诉我我错过了什么。我只能将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:'Windows'Microsoft.Net'assembly'GAC_32'mscorlib'v4.0_4.0.0.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)是完全相同的。什么好主意吗?非常感谢您的帮助。
我不知道是什么导致你的问题,但我有一个解决方案。既然会话对象正在被序列化,为什么不先序列化对象/对象列表,然后把它放到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);