.NET MVC传值
程序员文章站
2022-04-02 11:52:31
...
五种常见的数据传递方式
1,ViewBag
- C# 4.0引入,dynamic类型,object式的操作。
- dynamic 类型将在运行时确定内存,因此在使用时无需强转类型。
- object - ViewBag对象是语言提供的,所有的key都挂载在这个对象上,对象的实例化不需要程序员手工操作。按照面向对象,类对空值或null的默认赋值,我们不需要对ViewBag成员进行空或null的判断。
- 由于是动态类型,大量的数据并不适合由其携带,会导致性能问题。
- CV之间的传值。
Controller :
public ActionResult Index()
{
ViewBag.message = "这是一条来自ViewBag的消息";
return View();
}
View:
@ViewBag.message
2,ViewData
- 继承自ViewDataDictionary类的Dictionary。
- 对于复杂数据类型需要强类型转化,以避免意外错误。
- ViewData的生命周期由其所在的View决定,也意味着无法跨越视图传值。
- 在重定向(redirection)后,ViewData中存储的变量值将变为null,在取ViewData的值时还需要进行null或空的判断。
- CV之间的传值
- 相比于ViewBag,本质的差异就是一个是dynamic,一个是Dictionary。
Controller :
public ActionResult Index()
{
ViewData["Message"] = "这是一条来自ViewData的消息";
return View();
}
View:
@ViewData["Message"]
3,DataTemp
- 继承自TempDataDictionary的Dictionary。
- 默认情况下是基于Session存储机制之上。(你也可以基于其他存储机制实现, 通过自定义ITempDataProvider来完成,参见: Session-less Controllers and TempData in ASP.NET MVC)
- 其生命周期取决于请求次数,默认情况下第二次请求结束后自动标记且删除,可以跨越Action,重定向后数据仍然可共享。
- 取出DataTemp值时需要判断null或空,视图层还需额外的类型转化
- 多页面多Action之间的传值
Controller :
public ActionResult Index()
{
DataTemp["Message"] = "这是一条来自DataTemp消息";
return View();
}
View:
@DataTemp["Message"]
4,Model
- 强类型传递,意味着VS可以有代码提示(编译器自动检测到了该类型)
- 安全,逻辑性强,易维护
- M-V-C传递
Model:
Controller :
View:
browser:
5,Session
- 存在于服务端,生命周期为整个会话期
- 同样需要进行空或null的判断,及类型的转化
- 用法与效果与TempData类似
- 跨页面,跨方法传值
Controller:
将会得到与上面相同的效果,当然这只是最基本是用法,并没有凸显出类似TempData的效果,但这并不意味不行,读者可以自己去尝试一下。
下一篇: MVC实现 模型绑定传值