ASP.NET MVC中控制器怎么传递数据到视图

来源:网站主作者:清原小日向头衔:网络博主
导读:本期聚焦于小伙伴创作的《ASP.NET MVC中控制器怎么传递数据到视图》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《ASP.NET MVC中控制器怎么传递数据到视图》有用,将其分享出去将是对创作者最好的鼓励。

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

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。