View视图之在Action动作方法中传递参数给视图
View(视图)的职责是向用户提供界面,负责根据提供的模型数据生成准备提供给用户的格式界面,并提供用户与系统交互的入口。View和Action之间前后台数据传递的方式弱类型 ViewData[“paramName”]动态类型 ViewBag[“paramName”]强类型 Model临时存储 TempData[“paramName”]后台:return View(data) //存入ViewDat
View(视图)的职责是向用户提供界面,负责根据提供的模型数据生成准备提供给用户的格式界面,并提供用户与系统交互的入口。
View和Action之间前后台数据传递的方式
弱类型 ViewData[“paramName”]
动态类型 ViewBag[“paramName”]
强类型 Model
临时存储 TempData[“paramName”]
后台:return View(data) //存入ViewData.Model
前台:Model //其实就是WebViewPage.Model
Controller控制器:
Demo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVC_Project01.Controllers
{ /// <summary>
/// 控制器
/// </summary>
public class HomeController : Controller
{
// GET: Home
//动作方法:Index()
public ActionResult Index()
{
int[] nums = {10,20,30,40,50,60};
//ViewBag.numsArrayCount = nums.Length;
ViewBag.date = DateTime.Now;
ViewData["numsArrayCount"] = nums.Length;
TempData["newType"] = "体育新闻";
//强类型视图传递Model数据
return View(new User() { Name="jack", Age=25, Gender="male", Address="USA"});//对应的view:Index 不区分大小写
}
public ActionResult NewList()
{
return View();//对应的view:NewList 不区分大小写
}
}
}
使用ViewBag属性给当前动作方法对应的view传递临时参数
格式:
ViewBag.key=value;
使用ViewData属性给当前动作方法对应的view传递临时参数
格式:
ViewBag[key]=value;
传递的参数既可以是简单类型,也可以是复杂的数据类型(对象、数组、集合等等)
问题:
如果在Action动作方法里,不使用模型传参的方式(将model传递到View()方法),而是使用ViewBag、ViewData、TempData传递对象参数给View视图,在前台View中需要获取对象属性或者调用方法又该如何处理?
Demo:
准备实体类User:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVC_Project05.Models
{
public class User
{
public int UserId { get; set; }
public string UserName { get; set; }
public int Age { get; set;}
public string Telephone { get; set; }
}
}
在Controller中添加动作方法:
public ActionResult GetCurrentTime() {
User user = new User() {
UserId=10101,
UserName="paul gasol",
Age=36,
Telephone="0568-5598565-9612"
};
//注意: View(string viewName) 传入的时候切记如果是字符串类型,一定是视图名称
ViewBag.Message = "you are my destinty!";
ViewBag.Date = DateTime.Now;
ViewBag.User = user;
return View();
//return View(DateTime.Now);
}
添加Action方法对应的View视图GetCurrentTime.cshtml,然后在该视图中获取Action传递的数据:
@*
model关键字指定视图的模型类型
强类型视图:实际上就是给视图声明了一个类型参数,
渲染视图时必须强制传入对应的类型对象
( 在对应的动作方法里,必须在View()方法里传入Model),
否则将引发异常
*@
@*@model DateTime*@
@*引入Model类所在命名空间*@
@using MVC_Project05.Models
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>获取当前时间</title>
</head>
<body>
<div>
@*<p>当前时间:@Model.ToShortTimeString()</p>*@
@*
当接收从Acton传递来的参数(非Model传参方式)
使用ViewBag、ViewData、TempData
可以在Rasor表达式中先获取传递的对象,再获取其属性,
或调用其方法获取一些值
*@
@{
DateTime date = @ViewBag.Date;
string currentDate = date.ToShortTimeString();
User user = @ViewBag.User;
string userName = user.UserName;
int userId = user.UserId;
int age = user.Age;
string telephone = user.Telephone;
}
<p>Current Time:@currentDate</p>
<p>用户个人信息:</p>
<p>用户编号:@userId</p>
<p>用户姓名:@userName</p>
<p>年龄:@age</p>
<p>电话号码:@telephone</p>
</div>
</body>
</html>
Result:
分析:
对于自定义实体类,在前台View中,如果在Rasor表达式要使用,首先需要使用@using表达式引入其所在命名空间
注意:
ViewBag和ViewData只能向当前view传递数据
但是TempData可以向不同的Action传递数据,但是TempData的值在取了一次之后将被自动删除。
TempData的目的:
在一次请求中同时执行的多个Action之间共享数据
那么就可以在Action方法对应的view中获取共享数据
Index动作方法对应视图Index.cshtml:
在视图中读取在Action动作方法中传递的数据
@*
使用@model语句声明通过动作方法传递给该视图模型对象(Model)的类型
*@
@model MVC_Project01.Models.User
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>首页</title>
<style>
ul {
list-style:none;
}
</style>
</head>
<body>
<div>
<p>这是首页,欢迎光临!</p>
<p>
<label>Number Count:</label>
@*@ViewBag.numsArrayCount*@
@ViewData["numsArrayCount"]
</p>
<p>时间: @ViewBag.date</p>
@*<p>新闻类型: @TempData["newType"]</p>*@
<ul>
@*
使用@Model来引用视图模型对象的方法、字段或属性
*@
<li>UserName:@Model.Name</li>
<li>Age:@Model.Age</li>
<li>Gender:@Model.Gender</li>
<li>Address:@Model.Address</li>
</ul>
</div>
</body>
</html>
在NewList动作方法对应的视图NewList.cshtml中,获取在Index动作方法中,使用TempData传递的数据
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>新闻列表页</title>
</head>
<body>
<div>
<p>这是新闻列表页,欢迎光临!</p>
<p>新闻类型: @TempData["newType"]</p>
</div>
</body>
</html>
总结:
ViewData是字典型(Dictionary)(object类型),而ViewBag不再是字典的键值对结构,而是dynamic类型,dynamic类型与object类型的区别是在使用时dynamic会根据数据类型自动转换,而object类型则需要我们手动进行强制转换。
ViewData和ViewBag传递参数的生命周期和当前View相同,view加载完毕,其参数也被释放掉了。
TempData在同一个Controller中可跨多个Action动作方法传递参数,但只要取了一次就会被自动删除,起到的是一种共享数据的作用。
更多推荐
所有评论(0)