HOW TO: 将使用 Visual C#.NET 序列化为 Web 服务器控件

本文分步介绍了如何序列化 ASP.NET ListBox Web 服务器控件的 项目 属性。

当您开发 ASP.NET Web 应用程序,您可能希望存储到永久存储设备的 Web 服务器控件的属性。 通过创建扩展标准的 ASP.NET Web 控件库的功能的自定义类,可序列化 Web 服务器控件的公共属性。

  1. 启动 Microsoft Visual Studio.NET。
  2. 文件 菜单上单击 新建 ,然后单击 项目
  3. 项目类型 ,选择 Visual C# 项目 。 在 模板 ,下选择 类库
  4. 将该项目 SerializableControls,命名然后单击 确定 。 默认,一个类文件 (Class 1.cs) 是创建并添加到项目。
  5. 添加对 System.Web.dll 的一个引用。 要这样做,请按下列步骤操作:
    1. 在 Visual Studio.NET IDE 中 项目 菜单上单击 添加引用
    2. .NET 选项卡上找到 System.Web.dll ,然后单击 选择
    3. 在中,单击 确定 添加引用 对话框以接受您的选择。 如果您收到提示您选择在库生成包装,单击
  6. 在 Class 1.cs 类文件重命名为 SerialListBox.cs。 为此,右键单击 Class 1.cs,在解决方案资源管理器,,然后单击 重命名 。 键入 SerialListBox.cs ,然后按 Enter 键。
  7. 在 SerialListBox.cs 文件中替换的现有代码:
    using System;
    using System.Runtime.Serialization;
    using System.Web.UI.WebControls;
    
    namespace SerializableControls
    {
        [Serializable]
        public class SerialListBox : System.Web.UI.WebControls.ListBox , System.Runtime.Serialization.ISerializable
        {
            public SerialListBox() 
            {
            }
    
            // Deserialization constructor
            public SerialListBox(SerializationInfo info, StreamingContext context)
            {
                string strItem;
                string strValue;
    
                // Obtain the list of item keys.
                string itemList = info.GetString("ItemList");
                string [] items = itemList.Split(new Char[] {';'});
    
                // Create a new list item for each key in the ItemList.
                for(int nCount = 0; nCount < (items.Length - 1); nCount++)
                // use (items.Length - 1) due to terminating ';' delimiter 
                {
                    // list item Text property
                    strItem = items[nCount];  
    				
                    // list item Value property
                    strValue = info.GetString("Item-Value-" + strItem); 
    
                    this.Items.Add(new System.Web.UI.WebControls.ListItem(strItem, strValue));
                }
            }
    
            // Serialization function (see ISerializable)
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                string itemList = "";
    
                foreach(ListItem item in this.Items)
                {
                    // Add a ';' delimited list of item keys using the Text property of the item.
                    itemList += item.Text + ";";
    
                    // Add a Key/Value pair to the SerializationInfo object.
                    // Use the "Item-Value-<KEY>" format to distingush item-value properties
                    // from other properties stored in the SerializationInfo object.
                    info.AddValue("Item-Value-" + item.Text, item.Value);
                }
    
                info.AddValue("ItemList", itemList);
            }
        }
    }
    					
  8. 生成 菜单上单击 生成解决方案 生成解决方案。 或者,按 Shift + Ctrl+B。

Create an ASP.NET WebForm to Test the Serializable Web Server Control

<script type="text/javascript"></script>

  1. 在 Microsoft Visual Studio.NET 中单击 文件 菜单上的 新建 ,然后单击 项目
  2. 项目 ,下选择 Visual C# 项目 。 在 模板 ,下选择 ASP.NET Web 应用程序
  3. 位置 框中替换 SerializationTest 默认名称。 如果在使用本地服务器您可以将在服务器名保留为 http://localhost 中。 生成 位置 框如下所示:
    http://localhost/SerializationTest
    默认,在 WebForm 1.aspx 文件是创建和添加到项目。
  4. 添加一个对 SerializableControls 类库的引用。 要这样做,请按下列步骤操作:
    1. 项目 菜单中,Visual Studio.NET 集成开发环境 (IDE) 上, 单击 添加引用
    2. .NET 选项卡上请选择 浏览
    3. 打开 对话框找到该 SerializableControls.dll 文件,单击 打开 ,并单击 确定

      注意 : The SerializableControls.dll 文件将位于中刚刚创建类库项目在项目文件夹下的文件夹。
  5. 在较低的左角 Web 窗体设计器的单击要切换到 HTML 视图的 WebForm 1.aspx 的 HTML 。 替换现有代码与:
    <%@ Register TagPrefix="cc1" Namespace="SerializableControls" Assembly="SerializableControls" %>
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="SerializationTest.WebForm1" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
        <HEAD>
            <title>WebForm1</title>
            <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
            <meta name="CODE_LANGUAGE" Content="C#">
            <meta name="vs_defaultClientScript" content="JavaScript">
            <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        </HEAD>
        <body MS_POSITIONING="GridLayout">
            <form id="Form1" method="post" runat="server">
                <cc1:SerialListBox id="lstSerListBox" style="Z-INDEX: 101; LEFT: 85px; POSITION: absolute; TOP: 23px" 
               runat="server" Width="172px" Height="121px" EnableViewState="False" AutoPostBack="True">
                    <asp:ListItem Value="1">First Item</asp:ListItem>
                    <asp:ListItem Value="2">Second Item</asp:ListItem>
                    <asp:ListItem Value="3">Third Item</asp:ListItem>
                </cc1:SerialListBox>
                <asp:Button id="btnLoad" style="Z-INDEX: 105; LEFT: 17px; POSITION: absolute; TOP: 111px"
                runat="server" Text="Load"></asp:Button>
                <asp:Button id="btnSave" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 26px" 
                runat="server" Text="Save"></asp:Button>
                <asp:Label id="lblValue" style="Z-INDEX: 106; LEFT: 270px; POSITION: absolute; TOP: 25px" 
                runat="server" Width="68px" Height="22px">Value: </asp:Label>
            </form>
        </body>
    </HTML>
    					
    注意 : 在将代码粘贴 HTML 窗口时, 粘贴为 HTML 代码段。 为此,选择 编辑 菜单上的 粘贴为 HTML

    此代码将执行以下操作:

    • 向 Web 窗体添加 按钮 Web 服务器控件。 控件的 ID 为 btnLoad ,且 Text 属性为 负载
    • 向 Web 窗体添加 按钮 Web 服务器控件。 控件的 ID 为 btnSave ,且 Text 属性为 保存
    • 向 Web 窗体添加 Label 控件。
    • 添加包含三个列表项在 SerialListBox 自定义控件。 ID 设置为 lstSerListBox 。 要使用此控件,请您必须添加对 Web 页的顶部引用。 此引用 HTML 中定义命名空间和使用后标记的。
  6. 在较低的左角 IDE 的单击 设计 以切换到 WebForm 1.aspx 的设计视图。 双击 btnSave 。 在代码中的 Visual C#.NET 后启动 btnSave_Click() 事件处理程序 (WebForm 1.aspx.cs) 文件。 现有代码替换为下面:
    private void btnSave_Click(object sender, System.EventArgs e)
    {
        Stream stream = new FileStream(@"c:/Test/MyListBox.bin",   FileMode.Create, FileAccess.Write, FileShare.None);
    
        // Serialize the object, and close the TextWriter.
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, lstSerListBox);
        stream.Close();
    
        // Clear all SerialListBox items.
        lstSerListBox.Items.Clear();
        lblValue.Text = "";
    }
    					
    注意 : 在此代码,C:/Test 是您必须创建一个文件夹。 此文件夹包含在 Web 服务器控件的属性的文件。 请确保该文件夹具有帐户的写入权限的 ASP.NET 代码运行。 默认情况下, ASP.NET 应用程序在 1.0 版.NET Framework 的运行在 ASPNET 帐户下。
  7. 在解决方案资源管理器右键单击 WebForm 1.aspx 文件,然后单击 视图设计器 若要切换回 WebForm 1.aspx 文件的设计视图。 在设计视图中双击 btnLoad 按钮。 这将打开 btnLoad_Click() 事件处理程序在 Visual C#.NET 代码。 替换为下面的代码的现有代码:
    private void btnLoad_Click(object sender, System.EventArgs e)
    {
        // Open the FileStream to read from.
        Stream stream = File.OpenRead(@"C:/Test/MyListBox.bin");
    
        // Deserialize the object, and close the TextReader.
        BinaryFormatter formatter = new BinaryFormatter();
        lstSerListBox = (SerializableControls.SerialListBox)(formatter.Deserialize(stream));
        stream.Close();
    }
    					
  8. 切换回,WebForm 1.aspx 设计视图,然后双击 lstSerListBox 列表框控件。 这将打开 lstSerListBox_SelectedIndexChanged() 事件处理程序在 Visual C#.NET 代码。 现有代码替换为下面:
    private void lstSerListBox_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        lblValue.Text = "Value: " + lstSerListBox.SelectedItem.Value.ToString();
    }
    					
  9. 在 WebForm 1.aspx.cs 文件中将以下代码添加要导入这些命名空间的顶部:
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    					
  10. 生成 菜单上单击 生成解决方案 生成解决方案。 或者,按 Shift + Ctrl+B。
 

测试该 Web 窗体

<script type="text/javascript"></script>

  1. 在解决方案资源管理器右键单击 WebForm 1.aspx 文件,然后单击 在浏览器中的查看
  2. 看到包含 加载 按钮、 一个 保存 按钮、 一个列表框和标签在 Web 窗体页时, 单击列表框中的任何项。 标签控件显示所选的列表框项目的值。
  3. 单击 保存 。 列表框的内容序列化,,保存到磁盘中。 列表框的内容会消失。
  4. 单击 加载 。 序列化的数据读取磁盘和使用序列化的数据实例化一个新的 ListBox 控件。 列表框的内容会还原到以前的状态中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值