将IEnumerable添加到ViewState

时间:2015-05-13 18:47:06

标签: c# asp.net linq viewstate

private IEnumerable<Employee> Source1;

Source1 = Function1(); // Returns Ienumerable<Employee>
ViewState.Add("str", Source1); //ERROR HERE

更新

功能1

 public static IEnumerable<Employee> Function1(string id)
        {
            IEnumerable<Employee> all;
            DB db = new DB(id);
            all = db.GetValues()
                .OrderByDescending(date => date.Created);
            return all;
        }

public List<Employee> GetValues()
        {
            List<string> li = database.GetFilters(id, dID.Request);
            IEnumerable<Employee> requests = Employee.GetRequests();
            List<Employee> li1 = new List<Employee>();
            foreach (string pF in li)
            {
                li1.AddRange(requests.Where(r => r.result == pF).ToList());
            }
            return li1;
        }

我需要使这个函数可序列化吗?

这里,在编译时没有错误,但在页面加载时,我收到错误。

Error : Assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a534e089' is not marked as serializable.

2 个答案:

答案 0 :(得分:2)

您需要将Employee类标记为可序列化。 Session / ViewState通过序列化来保存复杂对象,因此需要对它们进行标记。

[Serializable]
public class Employee

答案 1 :(得分:2)

除了Employee被标记为可序列化(道格拉斯的回答)之外,集合本身也必须是可序列化的。例如,如果您的Function1方法使用yield return返回而不是返回具体集合,那么您仍然会遇到问题。如果它返回一个数组,它应该序列化很好 - 但由于签名只是IEnumerable<Employee>,你不能指望你回来的类型。

例如:

private static IEnumerable<Employee> Function1() {
    yield return new Employee { Id = 1, Name = "John" };
    yield return new Employee { Id = 2, Name = "Mary" };
}

ViewState.Add("str", Source1.ToArray());

这将确保无论您使用何种类型,都可以序列化一个简单的数组。