https://www.cnblogs.com/cynchanpin/p/7065098.html

在MVC3開始。视图数据能够通过ViewBag属性訪问。在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用。ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary)。

ViewBag和ViewData的差别:
ViewBag 不再是字典的键值对结构。而是 dynamic 动态类型。它会在程序执行的时候动态解析。

所以在视图中获取它的数据时候不须要进行类型转换

ViewData ViewBag
它是Key/Value字典集合 它是dynamic类型对像
从Asp.net MVC 1 就有了 ASP.NET MVC3 才有
基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework
ViewData比ViewBag快 ViewBag比ViewData慢
在ViewPage中查询数据时须要转换合适的类型 在ViewPage中查询数据时不须要类型转换
有一些类型转换代码 可读性更好

Contorller

<pre class="csharp" name="code">using NewOjbect.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace NewOjbect.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.UserName = "无盐海";
ViewBag.Age = "25";
ViewBag.Gender = 1; string[] Itmes = new string[] { "中国", "美国", "德国" };
ViewBag.itemsA = Itmes;// viewbag是一个新的dynamic类型keyword的封装器 //ViewData["Items"] = items; return View();
}
}
}

View

<pre class="html" name="code"><html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Test2</title>
</head>
<body>
<div>
username:<input type="text" id="UserName" name="UserName" value="@ViewBag.UserName" /></br> 年 龄: <input type="text" id="age" name="age" value=@ViewBag.Age /></br> 性 别:<input type="text" id="Gender" name="Gender" value="@ViewBag.Gender" /></br> <button>提交</button> <!---这里输出国家名-->>
@foreach (dynamic item in ViewBag.itemsA)
{
<p>@item</p>
}
</div>
</body>
</html>

一、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的使用方法
后台代码:

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;
return View();
}

前台代码:
后台用ViewData存值,前台既可以通过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]

三、两者的定义
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的基础上进行了封装处理。

四、两者的区别
ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData[“myName”]
ViewBag是动态类型,使用时直接通过属性赋值即可,ViewBag.myName
ViewData和ViewBag只在当前Action中有效,等同于View
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”])

五、简单总结
遇到未知的东西不要着急,现在每天有那么多新知识面世,没有人能记住所有的知识点,只要能静下心来认真研究总能学会的,一定要相信自己能行,不要对自己设限。
---------------------
作者:changuncle
来源:CSDN
原文:https://blog.csdn.net/xiaouncle/article/details/77825389
版权声明:本文为博主原创文章,转载请附上博文链接!

ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 动态数据的呈现的更多相关文章

  1. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 视图模板页

    https://www.cnblogs.com/xlhblogs/archive/2013/06/09/3129449.html MVC Razor模板引擎 @RenderBody.@RenderPa ...

  2. ASP.NET MVC Razor视图引擎攻略

    --引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...

  3. ASP.NET MVC——Razor视图引擎

    Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...

  4. MVC Razor视图引擎

    Razor 不是编程语言.它是服务器端标记语言. Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法 当网页被写入浏览器时,基于服务器的代码能够创建动 ...

  5. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 HtmlHelper-超链接方法

    一.@Html.ActionLink()概述 在MVC的Rasor视图引擎中,微软采用一种全新的方式来表示从前的超链接方式,它代替了从前的繁杂的超链接标签,让代码看起来更加简洁.通过浏览器依然会解析成 ...

  6. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 Areas区域说明

    https://www.cnblogs.com/webapi/p/5976642.html Asp.Net MVC Areas区域说明   一般网站分为前台+会员后台+管理员后台,做过webform的 ...

  7. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 视图引用资源

    https://www.cnblogs.com/Roxlin/p/5615144.html 一.配置BundleConfig.cs文件 1.首先要在App_Start 里面BundleConfig.c ...

  8. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2

    https://www.bbsmax.com/A/gAJG67OXzZ/ 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASP ...

  9. Asp.Net MVC Razor视图引擎与My97DatePicker插件的结合

    using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...

随机推荐

  1. this.getClass()和super.getClass()得到的是同一个类

    今天dubug代码时发现this.getClass()和super.getClass()得到的竟然是同一个类,都是当前类. 遍访网络资料得出: getClass()不受this和super影响,而是有 ...

  2. LiquiBase实战总结

    LiquiBase概述 Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备 ...

  3. mybatis 的 <![CDATA[ ]]> 标签作用

    有个细节一直没有注意到,今天mark一下: mybatis进行时间比较的时候我们会这么写,一直都是在复制粘贴所以没有注意,一个标签<![CDATA[ ]]> 今天在做另外一个有时间比较sq ...

  4. angular组件数据

    import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-news', templateUrl: ' ...

  5. Javascript——概述 && 继承 && 复用 && 私有成员 && 构造函数

    原文链接:A re-introduction to JavaScript (JS tutorial) Why a re-introduction? Because JavaScript is noto ...

  6. json简单案例

    1.Group类 import java.util.ArrayList; import java.util.List; class Group{ private int id; private Str ...

  7. 源码搭建LAMP环境

    需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Apache http://httpd.apache.org/  httpd主程序包(http server) MySQ ...

  8. centos7安装配置gitlab详细教程

    一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装ss ...

  9. 【c# 学习笔记】委托链的使用

    委托链其实就是委托类型,只是委托链把多个委托链接在一起而已,也就是说,我们把链接了多个方法的委托称为委托链或多路广播委托.如下: public delegate void DelegateTest() ...

  10. AOP实践—ASP.NET MVC5 使用Filter过滤Action参数防止sql注入,让你代码安全简洁

    在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检 ...