在ASP.NET MVC的架构设计中,控制器负责处理用户请求和业务逻辑,处理完成后需要将数据传递给视图进行页面渲染,不同的数据传递方式有着不同的特性和适用场景,开发者可以根据实际需求选择合适的方法。

常用数据传递方式介绍
1. 使用ViewData传递数据
ViewData是控制器中的一个字典类型属性,键为字符串,值为object类型,只能在当前请求对应的视图中使用,生命周期和当前请求一致。使用时需要先赋值,再在视图中通过键获取并做类型转换。
控制器中的代码示例:
using System.Web.Mvc;
namespace MvcDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
// 向ViewData中存入字符串数据
ViewData["UserName"] = "张三";
// 向ViewData中存入数值数据
ViewData["UserAge"] = 25;
return View();
}
}
}
对应视图中的代码示例:
<h3>ViewData传递的数据</h3> <p>用户名:<%= ViewData["UserName"] %></p> <p>年龄:<%= (int)ViewData["UserAge"] %></p>
2. 使用ViewBag传递数据
ViewBag是基于动态类型的属性,本质上是ViewData的封装,不需要做类型转换,使用起来更加灵活,同样只在当前请求的视图中有效,键名可以自定义。
控制器中的代码示例:
using System.Web.Mvc;
namespace MvcDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
// 直接给ViewBag的动态属性赋值
ViewBag.UserName = "李四";
ViewBag.UserScore = 95.5;
ViewBag.IsVip = true;
return View();
}
}
}
对应视图中的代码示例:
<h3>ViewBag传递的数据</h3> <p>用户名:<%= ViewBag.UserName %></p> <p>得分:<%= ViewBag.UserScore %></p> <p>是否会员:<%= ViewBag.IsVip %></p>
3. 使用TempData传递数据
TempData也是字典类型,它的数据可以跨请求使用,比如从控制器A的Action传递到控制器B的Action对应的视图,数据只会保留一次请求,读取后就会自动清除。
控制器中的代码示例:
using System.Web.Mvc;
namespace MvcDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult SetTempData()
{
// 存入TempData数据
TempData["Message"] = "这是跨请求传递的提示信息";
return RedirectToAction("ShowTempData");
}
public ActionResult ShowTempData()
{
// 读取TempData数据,读取后该数据会被清除
string msg = TempData["Message"] as string;
ViewBag.TempMsg = msg;
return View();
}
}
}
对应ShowTempData视图中的代码示例:
<h3>TempData传递的数据</h3> <p>提示信息:<%= ViewBag.TempMsg %></p>
4. 使用强类型Model传递数据
这是最推荐的数据传递方式,控制器把实体对象传递给视图,视图声明对应的模型类型,就可以直接使用模型的属性,有智能提示,也不需要类型转换,适合传递复杂的结构化数据。
首先定义实体类:
namespace MvcDemo.Models
{
public class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
}
控制器中的代码示例:
using System.Web.Mvc;
using MvcDemo.Models;
namespace MvcDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
UserInfo user = new UserInfo
{
Name = "王五",
Age = 30,
Email = "test@ipipp.com"
};
// 把实体对象作为Model传递给视图
return View(user);
}
}
}
对应视图中需要声明模型类型,代码示例:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MvcDemo.Models.UserInfo>" %>
<!DOCTYPE html>
<html>
<head>
<title>用户信息</title>
</head>
<body>
<h3>强类型Model传递的数据</h3>
<p>用户名:<%= Model.Name %></p>
<p>年龄:<%= Model.Age %></p>
<p>邮箱:<%= Model.Email %></p>
</body>
</html>
不同传递方式的对比
我们可以通过下面的表格更直观地了解几种传递方式的区别:
| 传递方式 | 类型 | 生命周期 | 是否需要类型转换 | 适用场景 |
|---|---|---|---|---|
| ViewData | 字典,值为object | 当前请求 | 是 | 传递少量临时数据 |
| ViewBag | 动态类型 | 当前请求 | 否 | 传递少量临时数据,使用更灵活 |
| TempData | 字典,值为object | 跨一次请求 | 是 | 重定向场景下的数据传递 |
| 强类型Model | 自定义实体类型 | 当前请求 | 否 | 传递结构化数据,推荐使用 |
使用注意事项
- ViewData和ViewBag本质是同一个数据源,修改其中一个另一个也会同步变化,不建议混合使用避免逻辑混乱。
- TempData读取后会自动清除,如果需要多次使用同一个TempData数据,可以调用
TempData.Keep("键名")方法保留数据。 - 强类型Model传递数据时,视图的模型类型必须和控制器传递的对象类型一致,否则会报错。
- 如果传递的数据是集合类型,同样可以使用强类型Model,视图声明为对应的集合类型即可。
ASP.NET_MVC控制器视图数据传递修改时间:2026-07-14 01:09:29