Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储对象到会话变量列表时获取序列化异常_C#_Ajax_Asp.net Mvc - Fatal编程技术网

C# 存储对象到会话变量列表时获取序列化异常

C# 存储对象到会话变量列表时获取序列化异常,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我有一个表单,我想将输入字段值存储到会话变量中。该表单用于创建新用户:管理员用户将输入新用户的用户名,转到下一页添加其他信息,然后创建用户。所以,我想将他们放在第一页上的信息存储到会话变量中,以便以后使用。问题是我得到了一个序列化异常 这是我在从第一页转到第二页时使用的ajax: function holdUserData() { //pass in username and a list of club IDs var data = { username: $(

我有一个表单,我想将输入字段值存储到会话变量中。该表单用于创建新用户:管理员用户将输入新用户的用户名,转到下一页添加其他信息,然后创建用户。所以,我想将他们放在第一页上的信息存储到会话变量中,以便以后使用。问题是我得到了一个序列化异常

这是我在从第一页转到第二页时使用的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';
        }
    })
}
和我的GoManager Club控制器,将数据存储到会话:

[HttpPost]
public ActionResult GoManagePolicy(string username, List<ClubVM> clubs)
{
    Session["Username"] = username;
    Session["Clubs"] = clubs;

    return this.Json(new { success = true });
}
我的俱乐部:


我应该怎么做才能保存列表俱乐部?

要序列化的类需要一个属性

这表示您打算将该类序列化并存储为一组字节。这就是将对象保存到会话时发生的情况。根据会话的实现,对象可以存储在内存中,也可以保存到数据库中

[Serializable()]
public class ClubVM
{
    public int ID { get; set; }
    /* ... */
}

像int这样的值类型已经可以序列化了。但是,如果ClubVM包含对其他类型的引用,那么这些类型也必须是可序列化的,除非您使用非序列化属性标记它们。等等但是,如果您将某个对象标记为非序列化,这意味着当您从会话中反序列化该对象时,该属性将丢失,因为在序列化该对象的其余部分时该属性未包含。

1序列化意味着创建该对象的JSON或XML表示形式。它不是一组字节。2存储在Proc内存中的对象不需要序列化。只有当会话存储类似于SQL Server时,这才是一个问题。序列化包括二进制序列化。它不仅限于JSON或XML。它很可能是一组字节。无论会话是如何序列化的,它都很重要。您不希望您的应用程序停止工作,因为您更改了SessionState实现。顺便说一句,这是一个非常真实的场景。我在一个应用程序上工作,该应用程序有一个存储在Session中的大型、不可序列化的类。它有各种疯狂的依赖关系。然后,我们尝试实现基于SQL的SessionState,如果不重写应用程序的一半,就无法实现。我们必须修改负载平衡,以确保用户始终停留在同一台服务器上,其状态存储在内存中。任何迫使他们切换服务器的事情都会使他们失去会话。对我来说,这听起来绝对是个糟糕的设计。在会话中存储一个巨大的、不可分割的对象是对会话的一种相当明显的滥用,几乎可以肯定的是,应该以另一种方式进行处理。这是一种可怕的设计,是对会话的严重滥用。对象拥有对任何事物的依赖关系。即使你把会话从图片中删掉,那也很糟糕。需要序列化的部分无法从其余部分中解救出来,这一事实说明了一切。
public class ClubVM
{
    public int ID { get; set; }
    /* ... */
}
[Serializable()]
public class ClubVM
{
    public int ID { get; set; }
    /* ... */
}