【问题标题】:Unable to serialize List<SelectListItem>无法序列化 List<SelectListItem>
【发布时间】:2012-08-27 16:20:51
【问题描述】:

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

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

它抛出了这个错误

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

有没有办法让List&lt;SelectListItem&gt;序列化?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 为什么这是不好的做法?因为视图模型不应该有关于视图组件的信息?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    除了不好的做法,如果转换到不同的会话存储系统并且您的代码中到处都是这些并且将它们更改出来不利于您的时间范围,您可以通过将您的课程标记为 [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 等后遇到此问题的任何人添加以下术语以供搜索。不客气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-08
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多