ASP.NET MVC (二、数据传递)

目录

前言:

1、数据传递

1.1、ViewData

 1.2、ViewBag

  1.3、TempData

2、Session的使用

2.1、Session是如何工作的:

2.2、Session优缺点: 

2.3、Session失效(如非必要,不要设置):

 2.4、Session的使用:

 3、集合传递与遍历:

3.1、集合列表遍历

3.2、集合字典遍历

前言:

ASP.NET MVC是最简洁、最方便、最高效、最快速的小型网站开发的方法,本文可以让一个小白用最快速的方式学会网站开发。

这个世界上只有一种真正的英雄主义: 认清生活的真想,并且任然热爱它。难道向上攀爬的那条路,不是比站在顶峰更让人心潮澎湃吗?

1、数据传递

控制器向视图传递少量数据,常见三种为: ViewData ViewBag TempData

1.1、ViewData

ASP.NET MVC 5源代码中ControllerBase类中ViewData属性的定义:

代码语言:javascript
复制
public ViewDataDictionary ViewData { get; set; }

 ViewData本身是ViewDataDictionary字典类型,其定义如下:

public class ViewDataDictionary : IDictionary<string, object>{}

使用方法:

控制器:

代码语言:javascript
复制
/// <summary>
/// Get
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
    ViewData["Message"] = "你知道一顿饱和顿顿饱的区别吗?";
    return View();
}

视图:

代码语言:javascript
复制
@* 视图中  *@
<h2>@ViewData["Msg"]</h2>

执行效果:

 1.2、ViewBag

控制器:

代码语言:javascript
复制
ViewBag.Msg = "一时的刺激和一辈子的幸福,那个更重要?";

 视图:

代码语言:javascript
复制
<h2>@ViewBag.Msg</h2>

执行效果:

  1.3、TempData

ViewData属性与ViewBag属性无法跨Action方法传递数据,当需要在多个Action方法之间传递数据时,可采用TempData属性。 TempData属性是将数据保存在Session中。

控制器:

代码语言:javascript
复制
/// <summary>
/// Get
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
    TempData["Msg"] = "一时的刺激和一辈子的幸福,那个更重要?";
    return View();
}
public ActionResult About()
{
    return View();
}

 创建【About.cshtml】视图:

代码语言:javascript
复制
<h2>@TempData["Msg"]</h2>
<hr/>
<h2>可是有些人分不清。</h2>

 【Index.cshtml】视图:

代码语言:javascript
复制
<a href="~/Test/About">跳转</a>

执行效果:

跳转效果:

2、Session的使用

 ASP.NET页面是"无状态"的,这意味着每次向服务器发送一个请求,服务器都会生成一个该页面的实例。但有时候,我们希望在不同的页面之间共享信息,比如购物车、用户登录等,于是,ASP.NET为我们提供了一个服务端的Session机制。

2.1、Session是如何工作的:

服务端的Session机制是基于客户端的,也就是说服务端的Session会保存每个客户端的信息到服务端内存中。具体过程是这样的: →客户端向服务端发出请求 →服务端响应客户端,并针对该客户端创建Session和唯一的Session ID →把Session ID作为key, Session内容作为value,以键值对形式存储到Session State Provider中 →客户端带着专属的Session ID再次向服务端请求 →服务端的Session机制根据客户端的Session ID,从Session State Provider中取出内容返回给客户端

2.2、Session优缺点: 

优点: ● 跨页面维持用户状态、信息 ● 使用方便,并且能存储任何类型 ● 能保存每个客户端的信息 ● 安全的、透明的

缺点:
● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能
● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能

2.3、Session失效(如非必要,不要设置):

代码语言:javascript
复制
<system.web>
    <sessionState mode="off" />
</sytem.web>

 2.4、Session的使用:

控制器:

代码语言:javascript
复制
Session["girl"] = "女生长期晚上12点后还不睡觉。";

 视图【Index.cshtml】

代码语言:javascript
复制
<a href="~/Test/About">跳转</a>

视图【About.cshtml】 

代码语言:javascript
复制
<h2>@Session["girl"]</h2>
<hr/>
<h2>会促进体内雄性激素的分泌</h2>
<h2>会:长胡子、长腿毛、嗓门变粗、变成真正的女汉子。</h2>

 执行跳转效果:

 3、集合传递与遍历:

测试对象【GirlSix】:

代码语言:javascript
复制
[Serializable]
public class GirlSix
{
    /// <summary>
    /// 编号
    /// </summary>
    public string id { get; set; }
    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime createDate { get; set; }
    /// <summary>
    /// 昵称
    /// </summary>
    public string nickName { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 简介
    /// </summary>
    public string introduce { get; set; }
}

3.1、集合列表遍历

控制器:

代码语言:javascript
复制
/// <summary>
/// 默认测试集合
/// </summary>
/// <returns></returns>
public List<GirlSix> DefaultList()
{
    List<GirlSix> lists = new List<GirlSix>();
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "董新颖", age = 20, introduce = "郭老师关门弟子之一。" });
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "王笑涵", age = 19, introduce = "北方有佳人,绝世而独立。" });
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "牛龙珠", age = 21, introduce = "笑若桃花三月开,清风徐徐醉颜来。" });
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "闫春娜", age = 21, introduce = "珠缨旋转星宿摇,花蔓抖擞龙蛇动。" });
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "刘梓佳", age = 20, introduce = "明眸善睐,辅靥承权,瑰姿艳逸,怡静体闲,端的是好一个花王,富贵的牡丹。" });
    lists.Add(new GirlSix() { id = System.Guid.NewGuid().ToString("N"), createDate = DateTime.Now, nickName = "魏慧娟", age = 21, introduce = "脉脉眼中波,盈盈花盛处。" });
    return lists;
}
代码语言:javascript
复制
//传递值视图
ViewBag.list = DefaultList();

视图:

代码语言:javascript
复制
@{
    ViewBag.Title = "主页面";
}
@* 视图中  *@
<table class="table table-bordered table-hover table-striped">
    <tr class="info">
        <td>编号</td>
        <td>创建时间</td>
        <td>昵称</td>
        <td>年龄</td>
        <td>简介</td>
    </tr>
    @foreach (var item in ViewBag.list)
    {
        <tr>
            <td>@item.id</td>
            <td>@item.createDate</td>
            <td>@item.nickName</td>
            <td>@item.age</td>
            <td><pre>@item.introduce</pre></td>
        </tr>
    }
</table>

 执行效果:

3.2、集合字典遍历

控制器:

代码语言:javascript
复制
/// <summary>
/// 默认字典
/// </summary>
/// <returns></returns>
public Dictionary<string, Object> DefaultMap() {
    Dictionary<string, Object> map = new Dictionary<string, object>();
    map.Add("code",200);
    map.Add("message","访问成功");
    map.Add("result",DefaultList());
    return map;
}
代码语言:javascript
复制
//传递值视图
ViewBag.list = DefaultMap();

 视图:

代码语言:javascript
复制
返回编码:@ViewBag.list["code"]
<hr/>
返回消息:@ViewBag.list["message"]
<table class="table table-bordered table-hover table-striped">
    <tr class="info">
        <td>编号</td>
        <td>创建时间</td>
        <td>昵称</td>
        <td>年龄</td>
        <td>简介</td>
    </tr>
    @foreach (var item in ViewBag.list["result"])
    {
        <tr>
            <td>@item.id</td>
            <td>@item.createDate</td>
            <td>@item.nickName</td>
            <td>@item.age</td>
            <td><pre>@item.introduce</pre></td>
        </tr>
    }
</table>

  效果如下:

 第二章【二、数据传递】完结。