我有一个表单,我想将输入字段值存储到会话变量。该表单用于创建新用户:管理员用户将输入新用户的用户名,转到下一页以添加其他信息,然后创建用户。所以,我想将他们放在第一页上的信息存储到会话变量中,以便以后能够使用它。问题是我得到了序列化异常。
这是我从第一页到第二页时使用的ajax:
function holdUserData() {
//pass in username and a list of club IDs
var data = {
username: $('#tbUsername').val(),
clubs: this.clubs
};
$.ajax({
type: "POST",
url: '/Users/GoManageClub', //store in GoManageClub controller
data: data,
success: function (data) {
//redirect to ManageClubAccess controller when done
window.location = '/Users/ManagClubAccess';
}
})
}
我的GoManageClub
控制器,将数据存储到会话:
[HttpPost]
public ActionResult GoManagePolicy(string username, List<ClubVM> clubs)
{
Session["Username"] = username;
Session["Clubs"] = clubs;
return this.Json(new { success = true });
}
当我只存储用户名字符串时,没有问题,并且变量已成功存储。但是当我存储List<ClubVM>
时,我得到了序列化异常:
Type 'myOrganization.ClubVM' in Assembly 'myorg, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable
我的ClubVM
:
public class ClubVM
{
public int ID { get; set; }
/* ... */
}
我该怎么做才能保存List<ClubVM> clubs
?
答案 0 :(得分:1)
要序列化的类需要Serializable属性。
这表示您打算将类序列化(存储为字节集。)这就是将对象保存到Session
时会发生的情况。根据{{1}}的实现,对象可以存储在内存中,也可以保存到数据库中。
Session
[Serializable()]
public class ClubVM
{
public int ID { get; set; }
/* ... */
}
等值类型已经可序列化。但是,如果int
包含对其他类型的引用,那么除非使用ClubVM
属性标记它们,否则这些类型也必须是可序列化的。等等。但是,如果你标记了一些NonSerialized
,这意味着当你反序列化对象(从NonSerialized
中检索它)时,该属性将会丢失,因为当序列的其余部分被序列化时它不包括在内。