ASP.NET MVC框架中的值传递问题
- 行业动态
- 2025-03-03
- 4
在ASP.NET MVC中,传值通常通过模型绑定实现。控制器方法参数可自动绑定表单数据或查询字符串,如
public ActionResult Method(int id)
。
传值方式 | 说明 | 示例代码(Controller) | 示例代码(View) |
ViewData | 基于字典的数据传递,Value值类型是object,使用时需进行类型转换 | ViewData["Test123"] = "Hello World. This is ViewData"; |
@ViewData["Test123"] |
ViewBag | dynamic动态类型,使用更简洁,但存在属性覆盖问题 | ViewBag.Test123 = "Hello World."; |
@ViewBag.tst123 |
TempData | 基于session,适用于跨页面单次传递 | TempData["tmpData"] = "I am TempData..."; |
@TempData["tmpData"] |
Model | 直接传模型对象,方便且类型安全 | return View("UserInfo", GetTestData()); |
@model IEnumerable
|
以下是关于ASP.NET MVC传值的详细说明:
ViewData传值
说明:
ViewData是基于字典的数据传递方式,在Controller中设置数据时,需要指定键和值,而在View中获取数据时,需要进行类型转换,因为其Value值类型是object。
示例代码:
Controller:
public ActionResult Index() { ViewData["Test123"] = "Hello World. This is ViewData"; return View(); }
View:
@ViewData["Test123"]
ViewBag传值
说明:
ViewBag是dynamic动态类型,使用起来比ViewData更简洁,但存在属性覆盖的问题,在Controller中设置数据时,不需要指定类型,而在View中直接通过属性名访问数据。
示例代码:
Controller:
public ActionResult Index() { ViewBag.Test123 = "Hello World."; return View(); }
View:
@ViewBag.Test123
TempData传值
说明:
TempData也是基于字典的数据传递方式,但它基于session,适用于跨页面单次传递数据,在Controller中设置数据后,可以在另一个请求中获取该数据,但获取后数据会被清除。
示例代码:
Controller:
public ActionResult Index() { TempData["tmpData"] = "I am TempData..."; return View(); }
View:
@TempData["tmpData"]
Model传值
说明:
Model是直接传递模型对象的方式,这种方式方便且类型安全,在Controller中返回视图时,同时指定视图的数据对象,而在View中可以直接使用模型对象。
示例代码:
Controller:
public ActionResult Index() { return View("UserInfo", GetTestData()); // GetTestData() 返回泛型集合}
View:
@model IEnumerable<MVC5Demo.Models.UserInfoViewModel> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(p => item.UserName)</td> <td>@(item.Sex == 0 ? "女" : "男")</td> <td>@Html.DisplayFor(p => item.Age)</td> <td>@Html.DisplayFor(p => item.Dept)</td> <td>@Html.ActionLink("编辑", "Edit", "UserInfo", new { id=item.UserID.ToString() }, null) @Html.ActionLink("删除", "Delete", "UserInfo", new { id = item.UserID.ToString() }, new { onclick="return confirm('确认删除'+item.UserName+'的记录?');" })</td> </tr> }
FAQs
Q1: ViewData和ViewBag有什么区别?
A1: ViewData是基于字典的数据传递方式,需要指定键和值,并且在使用时需要进行类型转换;而ViewBag是dynamic动态类型,使用更简洁,但存在属性覆盖的问题,简而言之,ViewBag提供了更便捷的语法糖,但可能会引发一些难以调试的错误。
Q2: TempData和Session有什么区别?
A2: TempData是基于session的,但它仅适用于跨页面单次传递数据,即数据在被读取后会被清除;而Session则可以存储在整个会话期间的数据,直到会话结束或手动移除。