我正在将现有的MVC3应用程序从InProc移动到ASP.Net会话状态服务。 其中一个模型对象具有以下属性:
public List<System.Web.Mvc.SelectListItem> StateCodes { get; set; }
并且它正在抛出此错误
无法序列化会话状态。在'StateServer'和 'SQLServer'模式,ASP.NET将序列化会话状态对象, 因此,不可序列化的对象或MarshalByRef对象是 不允许。如果类似的序列化,则适用相同的限制 由“自定义”模式下的自定义会话状态存储完成。
有没有办法让List<SelectListItem>
序列化?
答案 0 :(得分:5)
尝试使用SelectList
在Razor代码中创建选择列表项。让模型改为具有SelectList
所基于的基础数据的属性。您也可以尝试将SelectList
放入ViewBag
或ViewData
,这也可以解决问题。
在视图模型中存储SelectList
被认为是不好的做法。
答案 1 :(得分:2)
[只是在上面的答案中添加一些信息]我相信
在视图模型中存储SelectList被认为是不好的做法。
是因为viewmodel不应该以如此特定的方式构建,以了解如何向最终用户显示信息。
如果viewmodel有一个项目列表,并且视图呈现SelectList当然可以。但是视图可以选择以其他许多方式将数据呈现给最终用户。
答案 2 :(得分:0)
抛开坏习惯,如果转换到不同的会话存储系统并且您的代码杂乱无章,而更改代码不利于您的时间范围,则可以通过将班级标记为[Serializable]
然后更改属于selectlist项目列表的所有成员如下:
namespace blah.blah.blah
[Serializable]
public class Blah : FromBlah
[NonSerialized]
private List<SelectListItem> _mySelectList;
public List<SelectListItem> MySelectList
{
get { return _mySelectList; }
set { _mySelectList= value; }
}
此外,为在添加RedisSessionProvider,Redis,RedisSession等之后遇到此问题的所有人添加以下可搜索性术语。不客气。