6

我正在将现有的 MVC3 应用程序从 InProc 移动到 ASP.Net 会话状态服务。其中一个模型对象具有以下属性:

public List<System.Web.Mvc.SelectListItem> StateCodes { get; set; }

它抛出了这个错误

无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。

有没有办法List<SelectListItem>序列化?

4

3 回答 3

5

尝试在 Razor 代码中创建选择列表项,而不是使用SelectList. 让模型改为具有它所基于的基础数据的属性SelectList。您也可以尝试将 放在SelectListorViewBagViewData,这也可以解决问题。

在视图模型中存储SelectList's 被认为是不好的做法。

于 2012-08-27T16:24:12.097 回答
3

[只是在上面的答案中添加一些信息]我相信

在视图模型中存储 SelectList 被认为是不好的做法。

这是因为视图模型不应该以关于如何向最终用户显示信息的特定方式构建。

如果视图模型有一个项目列表,并且视图呈现一个 SelectList 当然可以。但是视图可以选择以许多其他方式将数据呈现给最终用户。

于 2015-02-10T12:36:12.573 回答
2

除了不好的做法,如果转换到不同的会话存储系统并且您的代码中充斥着这些并且更改它们不利于您的时间范围,您可以通过将您的班级标记为[Serializable]然后更改您的所有成员来获得选择列表列表以下项目:

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 等后遇到此问题的任何人添加以下术语以供搜索。不客气。

于 2018-07-11T14:03:20.280 回答