在做MVC开发时经常会用到ViewData和ViewBag进行传值操作,因为很常用所以在这里总结一下,以方便后来人。

Album.cs:

[csharp] view plain copy
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. namespace WebApplication5.Areas.MyArea.Models
  6. {
  7. public class Album
  8. {
  9. public string Title { get; set; }
  10. }
  11. }

一、ViewBag的使用方法

后台代码:

public ActionResult Index()
{Dictionary<string, string> address = new Dictionary<string, string>();address.Add("Lng", "12.353535");address.Add("Lat", "28.262626");address.Add("Location", "唐宁街十号");List<string> modules = new List<string>();modules.Add("Admin module");modules.Add("Recursive module");modules.Add("Consistent module");ViewBag.Name = "蝈蝈";ViewBag.Age = "18";ViewBag.Phone = "18233199999";ViewBag.Address = address;ViewBag.Modules = modules;return View();
}

前台代码: 
后台用ViewBag存值,前台既可以通过ViewBag取值,也可以通过ViewData取值。使用ViewData取值时,必须将数据转换成合适的类型;使用ViewBag取值时不需要转换数据类型。

@ViewData["Name"]
@ViewData["Age"]
@ViewData["Phone"]
@{Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
}
@if (dict != null)
{@dict["Lng"]@dict["Lat"]@dict["Location"]
}
@{List<string> list = ViewData["Modules"] as List<string>;
}
@if (list != null)
{@list[0]@list[1]@list[2]
}
<br/>
@ViewBag.Name
@ViewBag.Age
@ViewBag.Phone
@ViewBag.Address
@ViewBag.Address["Lng"]
@ViewBag.Address["Lat"]
@ViewBag.Address["Location"]
@ViewBag.Modules
@ViewBag.Modules[0]
@ViewBag.Modules[1]
@ViewBag.Modules[2]

二、ViewData的使用方法

后台代码:

//記得引用命名空間
using WebApplication5.Areas.MyArea.Models;public ActionResult Index()
{Dictionary<string, string> address = new Dictionary<string, string>();address.Add("Lng", "12.353535");address.Add("Lat", "28.262626");address.Add("Location", "唐宁街十号");List<string> modules = new List<string>();modules.Add("Admin module");modules.Add("Recursive module");modules.Add("Consistent module");ViewData["Name"] = "蝈蝈";ViewData["Age"] = "18";ViewData["Phone"] = "18233199999";ViewData["Address"]=address;ViewData["Modules"] = modules;//類List<Album> alist = new List<Album>();alist.Add(new Album { Title="ViewBag ViewData我的第一次傳值!"});alist.Add(new Album { Title = "ViewBag ViewData我的第二次傳值!" });ViewData["AlbumList"] = alist;return View();
}

前台代码: 
后台用ViewData存值,前台既可以通过ViewBag取值,也可以通过ViewData取值。使用ViewData取值时,必须将数据转换成合适的类型;使用ViewBag取值时不需要转换数据类型。

@using WebApplication5.Areas.MyArea.Models;//設置自己類的命名空間
@ViewData["Name"]
@ViewData["Age"]
@ViewData["Phone"]
@{Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
}
@if (dict != null)
{@dict["Lng"]@dict["Lat"]@dict["Location"]
}
@{List<string> list = ViewData["Modules"] as List<string>;
}
@if (list != null)
{@list[0]@list[1]@list[2]
}
<br/>
@ViewBag.Name
@ViewBag.Age
@ViewBag.Phone
@ViewBag.Address
@ViewBag.Address["Lng"]
@ViewBag.Address["Lat"]
@ViewBag.Address["Location"]
@ViewBag.Modules
@ViewBag.Modules[0]
@ViewBag.Modules[1]
@ViewBag.Modules[2]<ul>  @{  List<Album> alist = ViewBag.AlbumList as List<Album>;  if (alist != null)  {  foreach (var album in alist)  {  <li> @album.Title;</li>  }  }
}
</ul>  

三、两者的定义

ViewBag的定义:

public dynamic ViewBag {  get {  if (_dynamicViewData == null) {  _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);  }  return _dynamicViewData;  }
}

ViewData的定义:

public ViewDataDictionary ViewData {  get {  if (_viewData == null) {  SetViewData(new ViewDataDictionary());  }  return _viewData;  }  set {  SetViewData(value);  }
}

通过定义我们可以看出ViewBag是ViewData的动态封装器,相当于在ViewData的基础上进行了封装处理。

四、两者的区别

  1. ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData[“myName”]
  2. ViewBag是动态类型,使用时直接通过属性赋值即可,ViewBag.myName
  3. ViewData和ViewBag只在当前Action中有效,等同于View
  4. ViewData和ViewBag中的值可以互相访问

    注意: 
    1、只有当关键字是有效的C#标识符时,ViewBag才起作用。 
    例如:如果在ViewData[“Key With Space”]中存放一个值,那么就不能使用ViewBag访问,因为这样根本无法通过编译。 
    2、动态值不能作为一个参数传递给扩展方法,因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。 
    例如:@Html.TextBox(“name”,ViewBag.Name) 就会编译失败。 
    要使这行代码通过编译有两种方法: @Html.TextBox(“name”,(string)ViewBag.Name) 、@Html.TextBox(“name”,ViewData[“Name”])

五、简单总结

遇到未知的东西不要着急,现在每天有那么多新知识面世,没有人能记住所有的知识点,只要能静下心来认真研究总能学会的,一定要相信自己能行,不要对自己设限。

Asp.net MVC中ViewData与ViewBag的使用方法(改)相关推荐

  1. ASP.NET MVC中ViewData、ViewBag和TempData

    1.ViewData 1.1 ViewData继承了IDictionary<string, object>,因此在设置ViewData属性时,传入key必须要字符串型别,value可以是任 ...

  2. mvc中viewdata 和viewbag的区别

    ViewData                                                                           ViewBag 它是Key/Val ...

  3. 在ASP.NET MVC中加载部分视图的方法及差别

    在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. ...

  4. 关于 ASP.NET MVC 中的视图生成

    在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...

  5. 在ASP.NET MVC中实现Select多选

    我们知道,在ASP.NET MVC中实现多选Select的话,使用Html.ListBoxFor或Html.ListBox方法就可以.在实际应用中,到底该如何设计View Model, 控制器如何接收 ...

  6. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  7. [转载]Asp.net MVC中Controller返回值类型

    Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名 并且对Action也有一定的要求: 必须 ...

  8. ASP.NET MVC教程五:ASP.NET MVC中的路由

    一.概述 在ASP.NET MVC架构中,控制器在3大核心构件中处于中心地位,通过控制器支配模型和视图,然而从浏览器发出的请求到控制器还需要路由的协助,路由将特定的请求和控制器的动作对应起来. 在AS ...

  9. Asp.Net MVC中DropDownListFor的用法(转)

    2016.03.04 扩展:如果 view中传入的是List<T>类型 怎么使用 DropList 既然是List<T> 那么我转化成 T  List<T>的第一个 ...

最新文章

  1. 查看核心交换机CPU时的几个参数~~
  2. 为什么在旺遍天下生成代码我在线却是离线状态 旺旺在线代码生成
  3. 【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )
  4. 组态王中时间存access怎么存,组态王通过Access数据库起始截止日期查询方法
  5. 移动端适配--flexible.js
  6. Win10如何设置IE为默认浏览器
  7. 北大开源分词工具包: 准确率远超THULAC、jieba 分词
  8. 基于softmax的文本多分类模型代码实现
  9. Factorization Machines 学习笔记(二)模型方程
  10. 沃谈小知识|可“防拆”的远程锁机
  11. 北京大学计算机系 丁主任,北大“扫地僧”韦东奕,真的是正常人吗?北大丁教授说出了答案...
  12. Nature | 易基因DNA甲基化测序助力人多能干细胞向胚胎全能8细胞的人工诱导
  13. 小菊花宝宝课堂开课了,教你认识各种形状——用脚本绘图
  14. ocr移动端名片识别
  15. 期货现货升跌水(期货下跌现货一定下跌吗)
  16. (信贷风控七)申请评分卡模型Python实现(图文+代码实现)
  17. 6824入门坑 go build 错误
  18. oracle常用语句大全 来自csdn
  19. dinic 最大流费用流模板
  20. 拓事件丨腾讯给拓保软件颁奖啦!

热门文章

  1. JavaSE从头再来(一):面向对象、常用API
  2. python应用异常解决:sheet.column_dimensions[‘C‘].font=italic24Font无效
  3. [转载]二十四节气养生大全
  4. 揭秘3D电影幕后技术——两个摄像机像人眼一样拍
  5. 如何优雅的从OSM(OpenStreetMap)上获取一个城市的路网?
  6. 【机器学习】saturate的解释
  7. CSRF token is incorrect 问题解决
  8. 数据库设计方法论 - 继承
  9. 计算机会考在线考试系统,数苑_在线考试平台
  10. 初等数论四大定理之——费马小定理