无法序列化List <selectlistitem> </selectlistitem>

时间:2012-08-27 16:20:51

标签: c# asp.net-mvc-3

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

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

并且它正在抛出此错误

  

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

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

3 个答案:

答案 0 :(得分:5)

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

在视图模型中存储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等之后遇到此问题的所有人添加以下可搜索性术语。不客气。