Action向視圖傳值的6種方式(轉)


在使用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[]。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM