三、ASP.NET应用程序状态管理

一、在视图状态(ViewState)中存储对象

      在ViewState中,可以存储用户自定义的对象数据,但是必须知道,当存储一个自定义对象时,ASP.NET必须能够转换成该对象的字节流以便于将对象添加到页面隐藏域中进行保存。这意味着自定义对象必须支持序列化,否则ASP.NET将会抛出异常。

   例子:首先创建一个Book类,代码如下:

/// <summary>
///Book 的摘要说明
/// </summary>
[Serializable]    //使用Serializable属性使类可以序列化,这样就可以将这个类保存到ViewState中
public class Book
{
public Book(string bookname,string isbn,double price)
{
        BookName = bookname;
        ISBN = isbn;
        Price = price;   
}
    //书名
    public string BookName { get; set; }
    //ISBN编号
    public string ISBN { get; set; }
    //价钱
    public double Price { get; set; }
}

在Page_Load事件中添加如下的程序代码将自定义的对象放到ViewState中

    protected void Page_Load(object sender, EventArgs e)
    {
        Book book = new Book("ASP.NET 3.5完全自学手册", "1234-00000", 59.8);
        ViewState["Book"] = book;
        Book bk = (Book)ViewState["Book"];
        Label1.Text += "书名:" + bk.BookName + "<br/>";
        Label1.Text += "ISBN:" + bk.ISBN + "<br/>";
        Label1.Text += "价格:" + bk.Price + "<br/>";
   }

运行结果:


注意:代码中直接将Book对象实例赋给ViewState对象结合,如果集合中存在相同键的Book对象,则进行替换,否则创建一个新的集合项,在这里总结一下将自定义对象添加到视图状态时需要注意的两项:

1.类必须使用Serializable特性修饰,表示这是一个可序列化的类

2.所有成员类型必须为可序列化类型,任何不可序列化类型必须使用NonSerializabled特性修饰

除了使用自定义对象之外,.NET Framework本身就提供了非常多的对象可以保存到ViewState中,下面的代码演示如何保存一个泛型Dictionary对象到ViewState中,并从中读出Dictionary中的键值,代码如下所示:

         //下面的代码将一个泛型字典对象保存到ViewState中
        Dictionary<string, Book> books = new Dictionary<string, Book>();
        books.Add("Book1", new Book("C# 2010程序设计", "0000-0000", 88.8));
        books.Add("Book2", new Book("ASP.NET 2010", "0000-1111", 88.88));
        ViewState["BOOKS"] = books;

        //从ViewState中获取泛型字典对象,必须进行类型的转换
        books = (Dictionary<string, Book>)ViewState["BOOKS"];

        //遍历字典对象
        foreach (KeyValuePair<string, Book> bookDictionary in books)
        {
            Label1.Text += "Key=" + bookDictionary.Key + "<br/>";
            Book bk = (Book)bookDictionary.Value;
            Label1.Text += "书名:" + bk.BookName + "<br/>";
            Label1.Text += "ISBN:" + bk.ISBN + "<br/>";
            Label1.Text += "价格:" + bk.Price + "<br/>";
        }

运行结果如下:

二、使用Cookies保存会话信息

      Cookies应该就不用介绍了吧,直接上怎么使用吧!代码如下:

先创建如下的界面:

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    //保存Cookie
    protected void Button1_Click(object sender, EventArgs e)
    {
       //创建一个Cookie对象
        HttpCookie cookie = new HttpCookie("BookInfo");
        //为cookie赋值
        cookie["BookName"] = tb1.Text;
        cookie["ISBN"] = tb2.Text;
        cookie["Price"] = tb3.Text;
        //将cookie对象添加到Cookies集合发送到浏览器
        Response.Cookies.Add(cookie);
        //设置Cookie对象的过期时间
        cookie.Expires = DateTime.Now.AddDays(1);
    }

   //获取Cookie
    protected void Button2_Click(object sender, EventArgs e)
    {
        //从Request.Cookies集合获取指定名称的Cookie对象
        HttpCookie cookie = Request.Cookies["BookInfo"];
        //获取Cookie中指定键的值
        Label1.Text = "Cookie中的书籍信息是:<br/>";
        Label1.Text += cookie["BookName"] + "<br/>";
        Label1.Text+=cookie["ISBN"]+"<br/>";
        Label1.Text += cookie["Price"] + "<br/>";
    }

三、会话状态(Session)

    会话状态时特定于用户的,用法与Cookies相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值