在使用ASP.NET MVC進行項目開發時,經常會碰到從Action向視圖傳值的問題,今天我就把我所知道的方式總結了一下,分成了以下六種:
1.使用ViewData進行傳值
在Action中,有如下代碼:ViewData["name"] = "Vibin1";
則在視圖中可以這樣接收:姓名:@ViewData["name"]
注意:ViewData是一個簡單的字典,它的生命周期和所請求的View是一樣的,僅對當前View有效。
2.使用ViewBag進行傳值
在Action中,有如下代碼:ViewBag.name = "Vibin2";
則在視圖中可以這樣接收:姓名:@ViewBag.name
注意:上面的ViewBag本質上是通過ViewData進行傳值的,所以當同時使用ViewData和ViewBag的時候,如果定義的變量一樣,那么前面的會被后面的所覆蓋,像本文中1、2兩種方式一起使用都會顯示:姓名:Vibin2。如果非要使用這兩種傳值方式且不會產生覆蓋現象,那么必須保證變量名不同。
3.使用TempData進行傳值
在Action中,有如下代碼:TempData["name"] = "Vibin3";
則在視圖中可以這樣接收:姓名: @TempData["name"]
注意:TempData保存在Session中,這種方法可以跨Action使用。Controller每次請求的時候會從Session中獲取TempData並清空Session,因此TempData中的數據最多只能經過一次Controller傳遞。
4. 把對象當做返回視圖時的參數,通過Model接收
在Action中,有如下代碼:
Person p= new Person() { Name = "Vibin4" };
return View(p);
Person類定義如下:
public class Person
{
public string Name { get; set; }
}
則在視圖中可以這樣接收:
姓名: @{ Person p = Model as Person; } @p.Name
注意:在視圖頁面需要引入Person類的命名空間,且Person需要定義成公有的。這個本質上也還是通過ViewData中的Model對象進行傳值的,因此對於View()的重載,只要參數帶有object model的都可以借此傳值,即下圖紅框標記的重載。
5.可以使用Redirect()方法,這個方法傳入Url,可以考慮在Url后面帶參數
在Action中,有如下代碼:return Redirect( "/Another/Index?name=Vibin5" );//Another是另一個控制器名稱
則在視圖中可以這樣接收:姓名:@Request.Params["name"]
注意:這里由於是跳轉,視圖是另一個Controller下的Action對應的視圖。
如果Url是這種方式:"/Another/Index/Vibin5" ,
則在視圖中可以這樣接收:姓名:@Html.ViewContext.RouteData.Values["id"]
同樣,使用@Request.RequestContext.RouteData.Values["id"]或者@Html.ViewContext.RouteData.Route.GetRouteData(Html.ViewContext.HttpContext).Values["id"]也能接收到值。這是默認路由規則下的寫法,默認路由設定為:{controller}/{action}/{id},路由規則沒改,視圖中接收的變量就只能寫id不能改成name 。
6.可以使用RedirectToAction()方法,這個方法返回重定向結果對象,在該方法里傳入object對象作為參數
在Action中,有如下代碼:return RedirectToAction("Index", "Another", new { Name="Vibin6" });//借用前面定義的Person類
則在視圖中可以這樣接收:姓名:@Request.Params["name"]
注意:這里由於是跳轉,視圖是另一個Controller下的Action對應的視圖。RedirectToAction()方法有以下重載,只要參數帶有object routeValues的都可以用來傳遞對象,詳見下圖紅框標識。
*另外,第5、第6的示例中,用於視圖接收Url參數的Request.Params[]還可以換成Request[]或者Request.QueryString[]。