当前位置:首页 > 行业动态 > 正文

ASP.NET MVC框架中的值传递问题

在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则可以存储在整个会话期间的数据,直到会话结束或手动移除。

0