ASP.NET MVC中Controller控制器向View视图传值的几种方式

一、准备工作

创建一个ASP.NET MVC程序,然后在Models文件夹里面新添加Student实体类,用来模拟从Controller向View传递数据,Student类定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCStudyDemo.Models
{
    public class Student
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Sex { get; set; }

        public string Email { get; set; }
    }
}

二、通过ViewData传值

MVC从开始版本就一直支持使用ViewData将Controller里面的数据传递到View。ViewData定义如下:

从上面的截图中可以看出,ViewData里面存的是字典类型的数据,在查看ViewDataDictionary的定义:

注意:ViewDataDictionary继承自IDictionary等接口,所以ViewData里面的Value值类型是object的,使用的时候需要进行类型转换。

新建Controller,并命名为ViewDataDemo,该Controller用来模拟通过ViewData向View传递数据

Controller代码如下:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class ViewDataDemoController : Controller
    {
        // GET: ViewDataDemo
        /// <summary>
        /// 通过ViewData向对应的View传递数据
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            // 1、将字符串传递到View
            ViewData["Other"] = "通过ViewData向View传递字符串";
            // 2、通过KeyValuePair添加
            ViewData.Add(new KeyValuePair<string, object>("name","tom"));
            // 3、直接添加
            ViewData.Add("age", 23);
            // 4、传递集合到View
            ViewData["Data"] = new List<Student>()
            {
                new Student
               {
                 ID = 1,
                 Name = "唐僧",
                 Age = 34,
                 Sex = "男",
                 Email = "747976523@qq.com"
               },
               new Student
               {
                 ID = 2,
                 Name = "孙悟空",
                 Age = 635,
                 Sex = "男",
                 Email = "sunwukong@163.com"
               },
               new Student
               {
                 ID = 3,
                 Name = "白骨精",
                 Age = 4532,
                 Sex = "女",
                 Email = "74345523@qq.com"
               }
            };

            // 返回同名的视图
            return View();
        }
    }
}

对应的View视图代码如下:

@*引入Student的命名空间*@
@using MVCStudyDemo.Models;
@{
    ViewBag.Title = "Index";
    // 这里使用的是Razor语法,写的是后台C#代码
    // ViewData的Value值是Object类型的,需要进行类型转换
    // 常规写法是先在这里进行类型转换
    var list = ViewData["Data"] as List<Student>;
}

<h2>通过ViewData向View传递数据</h2>
<div class="jumbotron">
        <div>
            <div>
                1、传递字符串 other:@ViewData["Other"];
            </div>
            <div>
                2、传递字符串 name:@ViewData["name"];
            </div>
            <div>
                3、传递字符串 age:@ViewData["age"];
            </div>
            <div>
                4、传递集合方式一
                @foreach (var item in list)
                {
                    <div>
                        ID:@item.ID  Name:@item.Name  Age:@item.Age  Sex:@item.Sex  Email:@item.Email
                    </div>
                }
            </div>
            <div>
                5、传递集合方式二
                @foreach (var item in ViewData["Data"] as List<Student>)
                {
                    <div>
                        ID:@item.ID  Name:@item.Name  Age:@item.Age  Sex:@item.Sex  Email:@item.Email
                    </div>
                }
            </div>
        </div>
</div>

运行结果:

三、通过ViewBag传值

ViewBag是在MVC3中出现的,ViewBag是动态(dynamic)类型的。

新建Controller,并命名为ViewBagDemo,该Controller用来模拟通过ViewBag向View传递数据。

Controller代码:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class ViewBagDemoController : Controller
    {
        // GET: ViewBagDemo
        /// <summary>
        /// 通过ViewBag向View传递数据
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            // 通过ViewData传值
            ViewData["name"] = "ViewData";
            // 传递集合到View
            ViewData["Data"] = new List<Student>()
            {
                new Student
               {
                 ID = 1,
                 Name = "唐僧",
                 Age = 34,
                 Sex = "男",
                 Email = "747976523@qq.com"
               },
               new Student
               {
                 ID = 2,
                 Name = "孙悟空",
                 Age = 635,
                 Sex = "男",
                 Email = "sunwukong@163.com"
               },
               new Student
               {
                 ID = 3,
                 Name = "白骨精",
                 Age = 4532,
                 Sex = "女",
                 Email = "74345523@qq.com"
               }
            };

            // 通过ViewBag传值
            ViewBag.Name = "ViewBag";
            ViewBag.StudentData = new Student()
            {
                ID = 5,
                Name = "沙悟净",
                Age = 567,
                Sex = "男",
                Email = "4567890345@qq.com"
            };
            // 返回同名视图
            return View();
        }
    }
}

对应的Index视图代码:

@*引入Student的命名空间*@
@using MVCStudyDemo.Models;
@{
    ViewBag.Title = "Index";
    // ViewBag是dynamic类型的,使用的时候不需要进行类型转换
    var stu = ViewBag.StudentData;
    var stuList = ViewBag.Data;
}

<h2>通过ViewBag向View传递数据</h2>
<div class="jumbotron">
    <div>
        <div>
            Controller通过ViewBag向View传递数据
        </div>
        <div>
            1、通过ViewData传递字符串 ViewData["name"]:@ViewData["name"];
        </div>
        <div>
            2、通过ViewBag传递字符串 ViewBag.name:@ViewBag.Name;
        </div>
        <div>
            3、输出stu
            <div>
                ID:@stu.ID  Name:@stu.Name  Age:@stu.Age  Sex:@stu.Sex  Email:@stu.Email
            </div>
            4、输出stuList
            @foreach (var item in stuList)
            {
                <div>
                    ID:@item.ID  Name:@item.Name  Age:@item.Age  Sex:@item.Sex  Email:@item.Email
                </div>
            }
        </div>
    </div>
</div>

运行结果;

看了上面的运行结果,你可能会提出如下的两个疑问:

1、Controller里面没有定义ViewBag.Data,为什么在这里可以使用呢?

这是因为ViewBag是从MVC3版本才开始出现的,为了兼容以前的ViewData,所以这里虽然没有定义ViewBag.Student,但是ViewBag可以使用ViewData里面定义的Data数据。

2、ViewData["name"]和ViewBag.name的值是一样的

在控制器里面明明设置的两个值是不同的,但是为什么这里都变成一样的了呢?这是因为ViewData和ViewBag的属性是重叠的,两者都是字典类型的,一切以后面定义的属性为准,即后面定义的会覆盖前面定义的。

修改Controller代码,将ViewData的顺序放到ViewBag后面:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class ViewBagDemoController : Controller
    {
        // GET: ViewBagDemo
        /// <summary>
        /// 通过ViewBag向View传递数据
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            // 通过ViewData传值
            //ViewData["name"] = "ViewData";
            // 传递集合到View
            ViewData["Data"] = new List<Student>()
            {
                new Student
               {
                 ID = 1,
                 Name = "唐僧",
                 Age = 34,
                 Sex = "男",
                 Email = "747976523@qq.com"
               },
               new Student
               {
                 ID = 2,
                 Name = "孙悟空",
                 Age = 635,
                 Sex = "男",
                 Email = "sunwukong@163.com"
               },
               new Student
               {
                 ID = 3,
                 Name = "白骨精",
                 Age = 4532,
                 Sex = "女",
                 Email = "74345523@qq.com"
               }
            };

            // 通过ViewBag传值
            ViewBag.Name = "ViewBag";
            ViewBag.StudentData = new Student()
            {
                ID = 5,
                Name = "沙悟净",
                Age = 567,
                Sex = "男",
                Email = "4567890345@qq.com"
            };
            // 把ViewData的顺序放到ViewBag后面
            ViewData["name"] = "ViewData";
            // 返回同名视图
            return View();
        }
    }
}

在查看Index视图显示效果:

这时会发现,Index视图里面显示的都是ViewData的值了。

四、通过TempData传值

查看TempData的定义:

我们发现TempData也是字典类型的。

新建Controller,并命名为TempDataDemo,该Controller用来模拟通过TempData向View传递数据。

Controller代码:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class TempDataDemoController : Controller
    {
        // GET: TempDataDemo
        public ActionResult Index()
        {
            // ViewData
            ViewData["Name"] = "tom";
            // ViewBage
            ViewBag.Name = "Jon";
            // TempData
            TempData["Name"] = "Andi";
            TempData["Stu"] = new Student()
            {
                ID = 5,
                Name = "沙悟净",
                Age = 567,
                Sex = "男",
                Email = "4567890345@qq.com"
            };

            // 返回同名视图
            return View();
        }
    }
}

对应的Index视图代码,TempData也是字典类型的,所以在View页面中使用的时候也需要进行类型转换:

@*引入Student的命名空间*@
@using MVCStudyDemo.Models;
@{
    ViewBag.Title = "Index";
}
@{
    // 类型转换
    var stu = TempData["Stu"] as Student;
}

<h2>通过TempData向View传递数据</h2>
<div class="jumbotron">
    <p>
        <div>
            <div>
                通过ViewData传递字符串 ViewData["Name"]:@ViewData["Name"];
            </div>
        </div>
    </p>

    <p>
        <div>
            <div>
                通过ViewBag传递字符串 ViewBag.Name:@ViewBag.Name;
            </div>
        </div>
    </p>
    <p>
        <div>
            <div>
                1、传递字符串 TempData["Name"]:@TempData["Name"];
            </div>
            2、输出stu
            <div>
                ID:@stu.ID  Name:@stu.Name  Age:@stu.Age  Sex:@stu.Sex  Email:@stu.Email
            </div>
        </div>
    </p>
</div>

运行结果:

从上面的结果中可以看出:TempData的属性值不会覆盖上面定义的属性值。那TempData还有什么作用呢?在看下面的代码:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class TempDataDemoController : Controller
    {
        // GET: TempDataDemo
        public ActionResult Index(int? id)
        {
            // ViewData
            ViewData["Name"] = "tom";
            // ViewBage
            ViewBag.Name = "Jon";
            // TempData
            TempData["Name"] = "Andi";
            TempData["Stu"] = new Student()
            {
                ID = 5,
                Name = "沙悟净",
                Age = 567,
                Sex = "男",
                Email = "4567890345@qq.com"
            };

            if(id==null)
            {
                // 跳转到TempDataTest方法
                return RedirectToAction("TempDataTest");
            }
            else
            {
                // 返回同名视图
                return View();
            }
        }

        public ActionResult TempDataTest()
        {
            // 返回同名视图
            return View();
        }
    }
}

TempDataTest视图代码:

@*引入Student的命名空间*@
@using MVCStudyDemo.Models;
@{
    ViewBag.Title = "TempDataTest";
    // 类型转换
    var stu = TempData["Stu"] as Student;
}

<h2>TempDataTest</h2>
<h3>ViewData["Name"]:@ViewData["Name"]</h3>
<h3>ViewBage.Name:@ViewBag.Name</h3>
<h3>TempData["Name"]:@TempData["Name"];</h3>
<h3>ID:@stu.ID  Name:@stu.Name  Age:@stu.Age  Sex:@stu.Sex  Email:@stu.Email</h3>

我们先在浏览器里面输入下面的地址:http://localhost:1098/TempDataDemo/index/12,这里给id传值12,根据代码,会显示Index视图:

我们看到:ViewData、ViewBag和TempData都可以取到值。

在浏览器里面输入下面的URL地址:http://localhost:9080/TempDataDemo/index,这就表示传递的id是null值,根据代码,会返回TempDataTest视图,运行结果:

从结果会发现这时ViewData和ViewBag都取不到数据了,只有TempData可以取到数据,可以得出TempData和ViewData、ViewBag的区别:

  • ViewData和ViewBag不能跨Action方法使用,TempData可以跨Action方法使用,因为TempData是基于session存储的。
  • TempData只能跨Action方法访问一次,再次访问数据也会丢失。

五、Model传值

在Action放过里面的View上面F12转到定义:

可以看到View有很多重载,其中一种可以直接传递model,如上面截图中红框所示。

新建Controller,并命名为ModelDemo,该Controller用来模拟通过Model向View传递数据。

对应的controller代码:

using MVCStudyDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCStudyDemo.Controllers
{
    public class ModelDemoController : Controller
    {
        // GET: ModelDemo
        public ActionResult Index()
        {
            Student student = new Student()
            {
                ID = 5,
                Name = "沙悟净",
                Age = 567,
                Sex = "男",
                Email = "4567890345@qq.com"
            };
            // 返回model
            return View(student);
            // 或者直接返回
            //return View(new Student()
            //{
            //    ID = 5,
            //    Name = "沙悟净",
            //    Age = 567,
            //    Sex = "男",
            //    Email = "4567890345@qq.com"
            //});
        }
    }
}

Index视图代码:

@{
    ViewBag.Title = "Index";
}
@*不需要进行类型转换*@
<h2>通过Model向View传值</h2>
<h3>ID:@Model.ID</h3>
<h3>Name:@Model.Name</h3>
<h3>Age:@Model.Age</h3>
<h3>Sex:@Model.Sex</h3>
<h3>Email:@Model.Email</h3>

运行结果:

六、总结

最后总结一下ViewData和ViewBag的区别:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET MVC项目部署方式介绍

    目录 一.直接用源代码部署 1.新建网站 2.配置添加网站 3.浏览 二.使用发布文件部署 1.发布文件 2.部署 ASP.NET MVC编写的程序需要部署到IIS上面才能进行访问,部署方式分为两种. 一.直接用源代码部署 第一种方式可以直接使用源代码进行部署.部署步骤: 1.新建网站 在IIS里面选择网站,然后右键选择“添加网站” 然后打开“添加网站”对话框: 2.配置添加网站 界面配置如下: 然后点击确定,这时在左侧的网站列表中就可以看到新添加的网站. 3.浏览 在左侧列表选中要浏览的网站,

  • ASP.NET MVC自定义异常过滤器

    一.异常过滤器 异常筛选器用于实现IExceptionFilter接口,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行.异常筛选器可用于执行诸如日志记录或显示错误页之类的任务.HandleErrorAttribute类是异常筛选器的一个示例. 先来看看HandleErrorAttribute类的定义: #region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364

  • ASP.NET MVC授权过滤器用法

    过滤器 过滤器(Filter)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,并不是每个请求都会响应内容,只有那些有特定权限的用户才能响应特定的内容.过滤器理论上有以下功能: 判断登录与否或者用户权限. 决策输出缓存. 防盗链. 防蜘蛛. 本地化与国际化设置. 实现动态Action(做权限管理系统经常用到). 1.使用方式一 第一种方法是在Controller或Action上面直接使用Authorize特性,不设置特性的任何属性.看下面的截图: 从上面的截图中可

  • ASP.NET Core MVC 依赖注入View与Controller

    目录 一.ASP.NET Core MVC 之依赖注入 View 1.填充查找数据 2.重写服务 二. ASP.NET Core MVC 之依赖注入 Controller 1.构造函数注入 2.使用 FromServices 操作注入 3.在控制器中访问设置 一.ASP.NET Core MVC 之依赖注入 View ASP.NET Core 支持在试图中使用依赖注入.这将有助于提供视图专用的服务,比如本地化或者仅用于填充视图元素的数据.应尽量保持控制器和视图之间的关注点分离.视图所显示的大部分

  • ASP.NET MVC自定义操作过滤器

    目录 一.操作过滤器 1.定义 2.案例 2.1.创建自定义操作过滤器 2.2.新建控制器 二.结果过滤器 1.定义 2.案例 三.案例 1.记录操作 1.1.创建实体类 1.2.创建日志类 1.3.修改操作过滤器类 2.实现权限控制功能 一.操作过滤器 1.定义 操作过滤器用于实现IActionFilter接口以及包装操作方法执行.IActionFilter接口声明两个方法:OnActionExecuting和OnActionExecuted.OnActionExecuting在操作方法之前运

  • ASP.NET MVC自定义异常过滤器使用案例

    目录 一.需求 二.案例 1.创建工具类 1.1.创建日志工具类 1.2.创建网络工具类 2.创建自定义异常类 3.创建控制器 4.测试 在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真实案例讲解一下如何使用自定义异常过滤器. 一.需求 本案例要实现的功能需求:在发生异常时记录日志,日志内容包括发生异常的Controller名称.Action名称.使用浏览器类型和版本等. 二.案例 1.创建工具类 首先创建项目中需要使用的工具类. 1.1.创建日志工具类 在案例中使用Log4net

  • ASP.NET MVC实现区域路由

    目录 一.区域路由 二.示例程序 1.新建区域路由 2.注册区域路由 2.1.区域路由文件 2.2.全局注册区域路由 一.区域路由 为了管理网站中大量的文件,在ASP.NET MVC 2.0版本中引入了一个新概念:区域(Area). 有了区域以后,可以让我们的项目不至于太复杂而导致管理混乱.每个模块的页面都放入相应的区域内进行管理很方便.看下面的截图: 上图中有两个模块:一个是User模块,另一个是Product模块,所有关于这两个模块的Controller.Model.View都放入各自的模块

  • ASP.NET MVC自定义授权过滤器

    目录 一.授权过滤器 二.示例 1.添加对应实体类 2.添加测试数据 3.新建继承类 4.添加Account控制器 5.修改配置文件 6.添加授权控制器 三.测试 测试Welcome 四.总结 一.授权过滤器 授权过滤器用于实现IAuthorizationFilter接口和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全策略.AuthorizeAttribute类继承了IAuthorizationFilter接口,是授权过滤器的示例.授权过滤器在任何其他过滤器之前运行. 如果要自

  • ASP.NET MVC过滤器执行顺序介绍

    如果某个Action过滤器运用了多种过滤器,那么过滤器的执行顺序是如何呢? 规则一:不同类型的过滤器有一个先后顺序 即执行顺序是:授权过滤器->动作过滤器->结果过滤器->异常过滤器. 注意:如果ActionFilter过滤器执行过程中发生了异常,那么会执行ExceptionFilter过滤器,不会执行ResultFilter过滤器.上图所示的是正常情况下的执行顺序. 规则二:控制器上面的过滤器优先于方法上面的过滤器 即控制器和方法上面都使用了相同的过滤器,那么先执行控制器上面的过滤器.

  • ASP.NET MVC模式简介

    目录 一.MVC模式简介 1.MVC在Web框架中的应用 2.执行顺序 二.ASP.NET中的MVC 1.ASP.NETMVC和ASP.NET 2.ASP.NETMVC和WebForms 三.创建ASP.NETMVC 1.选择文件->新建->项目 2.选择.NETFramework版本的ASP.NETMVC 3.配置项目名称和路径 3.1.选择一种应用程序模板 3.2.测试 3.3.配置身份验证 一.MVC模式简介 MVC模式是一种流行的Web应用架构技术,它被命名为模型-视图-控制器(Mod

  • .Net MVC将Controller数据传递到View

    一.通过ViewData传值 MVC从开始版本就一直支持使用ViewData将Controller里面的数据传递到View.ViewData定义如下: 从上面的截图中可以看出,ViewData里面存的是字典类型的数据,在查看ViewDataDictionary的定义: 注意:ViewDataDictionary继承自IDictionary等接口,所以ViewData里面的Value值类型是object的,使用的时候需要进行类型转换. Controller代码如下: using MVCPassVa

  • ASP.NET MVC模式中应用程序结构详解

    目录 一.App_Data 二.App_Start 三.Content 四.Controllers 五.font 六.Models 七.Scripts 八.Views 九.Web.config 1.根目录下面的Web.config文件 2.Views文件夹下面的Web.config 十.Global.asax 在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App

随机推荐