【问题标题】:class object serializable for ViewState storage not working in c# ASP.net可用于 ViewState 存储的类对象可序列化在 c# ASP.net 中不起作用
【发布时间】:2014-08-12 05:56:25
【问题描述】:

我创建了一个面板来存储我的 ListBox,我的目标是在我按下页面上的 Button 控件时动态添加新的 Listbox。

我创建了一个继承 List 类的 MyList 类,并应用了 [Serializable] 标签。我已经应用序列化来将对象存储在视图状态中。

MyList 类将存储所有动态创建的 ListBox。

问题:

  • 当代码运行时,页面加载但是当我单击按钮时 存储列表的viewstate报错,怎么回事?
  • 据我所知,我只需要序列化 ​​MyList 类即可将其存储在 视图状态,这是正确的吗?
  • MyList的基类(List)还需要序列化吗?

    public partial class _default : System.Web.UI.Page
    {
        MyList<ListBox> myList;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            myList = new MyList<ListBox>();
            myList.Add(new ListBox());
            Panel1.Controls.Add(myList[0]);
            Button1.Click += Add_ListBox1;
        }
    
        public void Add_ListBox1(object sender, EventArgs e)
        {
            ListBox temp_listBox = new ListBox();
            myList.Add(temp_listBox);
            Panel1.Controls.Add(temp_listBox);
            ViewState["ListBox_list"] = myList; 
        }
    }
    
    [Serializable]
    public class MyList<ListBox> : List<ListBox> 
    { 
    
    }
    

点击前加载的页面:

点击按钮后的错误信息:

【问题讨论】:

  • System.Web.UI.WebControls.ListBox 不是可序列化的组件。我认为您添加到网页的任何列表框都会自动使用视图状态。您存储 mylist 的目的是什么?
  • 列表框将用于创建产品类别选择。根据在一个列表框上所做的选择,子类别将显示在下一个列表框上。它必须是动态的,因为列表框的数量可能会因所选的子类别或类别而异。需要将列表框传输到服务器才能从数据库中读取和写入数据。
  • 我同意布赖恩的观点。也许您可以使用树视图而不是使用动态列表框。

标签: c# asp.net object viewstate serializable


【解决方案1】:

虽然您已将您的类标记为 [serializable],但它依赖于不可序列化的 ListBox。

我做了一点谷歌搜索,发现 this 可能会有所帮助,尽管它看起来比我预期的要复杂。

几个快速的想法:

  • 动态内容是 WebForms 中的弱点之一,因为如您所见,动态内容在回发后会丢失,因此必须以某种方式保留和重新创建它。在这些情况下,我尝试消除回发并更多地依赖 JavaScript,因此浏览器永远不会被重置......这是新 MVC 模型大放异彩的地方之一,因为它不会一直与你对抗(作为 postpack模型无意中做到了)。实际上,这种痛苦是促使我们转向单页应用程序的主要因素之一。

  • 您最好编写自己的类,其中包含您关心的关于这些列表框的内容,例如位置及其内容,希望只是一些简单的字符串,然后将其序列化...然后编写自己的将它们反序列化为 ListBox 的代码。

顺便说一句,没有什么反对网络表单的,我现在在另一个窗口中打开了一个!

【讨论】:

  • 离题,但仍然:我正在创建的网站的许多方面都是基于动态内容,例如这个列表框查询。我正在尝试建立的网站是一个从零开始的电子商务。我已经构建了我所有的数据库逻辑。阅读您所说的关于动态使用 webforms 的内容让我无法继续前进,我已经投入了很多时间来学习 ASP.net webforms,但是如果我重新开始使用 MVC,会不会有一个戏剧性的学习路径? MVC 是趋势吗?
  • @Luther 当我说动态内容时,我的意思是专门动态添加新控件。这就是你的目的吗?
  • 是的,以编程方式添加表单、控件...
  • @Luther 好吧,我不会说这只是错误的方向,webforms is 完全有能力处理这个......无论您使用什么平台,这都不是一件容易的事。问题是您失去了回发的一些力量,因为如果您使用回发,它将需要您重新构建所有内容。所以你最终编写了所有这些状态重建代码。但也许这不是世界末日。
  • @JohnSaunders 感谢您让我知道您为什么对我投反对票,约翰。但是,我恳请您再读一遍,因为我认为我没有说出您的想法。 :) 我说过 webforms 的回发模型在处理动态创建的内容的特定情况下会与您作斗争,因为使用它会导致内容丢失。如果有一些不正确的方法,我真诚地想知道如何到达那里,因为这是几个项目的痛点。
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2012-04-07
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多