使用ViewState时出现异常

Dmi*_*iyd 5 c# asp.net exception

我明白了:

System.Runtime.Serialization.SerializationException

在Assembly'System.Web中键入'System.Web.UI.WebControls.Button',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未标记为可序列化.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.Runtime.Serialization.SerializationException:在Assembly'System.Web中键入'System.Web.UI.WebControls.Button',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未标记为可序列化.

当我尝试将List保存到viewState并在Page_PreInit事件中恢复它时,我得到它

我设置按钮并将它们添加到我稍后保存到viewState的列表中:

      ViewState["Buttons"] = buttons;
Run Code Online (Sandbox Code Playgroud)

然后我想检索它们并将它们附加回它们的事件处理程序:

  void Page_PreInit(object sender, EventArgs e)
    {

        List<Button> btn = (List<Button>)ViewState["Buttons"];
        if (btn!=null)
        {
            foreach (var item in btn)
            {
                item.Width = 20;
                item.Command += obtainTopicsPerPage_Click;
                item.CommandName = tPage.ToString();
                item.Text = tPage.ToString();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 5

根据异常消息,System.Web.UI.WebControls.Button不可序列化.(这并不奇怪.)为了将某些内容保存到ViewState,它必须是可序列化的,以便可以将完整的"self"写入字符串并存储在hiddenViewState页面上的表单值中.

为什么要尝试Button在ViewState中存储s?ViewState对于存储小值和其他隐藏形式字段的东西非常有用.但整个UI控件?你想用它做什么?

如果您只需要Button根据ViewState中的某些数据动态创建控件,那么您应该只存储最少量的数据以使其成为可能,并Button在该数据的代码中创建s.像这样的东西:

List<string> btn = (List<string>)ViewState["ButtonStrings"];
foreach (var str in btn)
{
    var item = new Button();
    item.Width = 20;
    item.Command += obtainTopicsPerPage_Click;
    item.CommandName = tPage.ToString();
    item.Text = tPage.ToString();
    // some use of the str from the ViewState
    // or if all you need is a count, just store an int in ViewState and use a for loop
}
Run Code Online (Sandbox Code Playgroud)

  • @Dmitry Makovetskiyd:听起来你正在做一些严重的错误. (2认同)