iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 12
0
Modern Web

我的30天MVC從零到不知道多少學習筆記系列 第 12

從零開始的MVC開發-Controller對View的喊話

  • 分享至 

  • xImage
  •  

上一篇文章提到~
controller傳值給view有以下四種方式
Model ViewBag ViewData TempData
那這次就來介紹一下四種的差異,以及用法

Model
其中只有Model是強型別物件,且傳遞的方式跟其他人不同
Model傳遞方式是在Action中 return View(Model);
或是 return PartialView(Model); 這樣傳給View
且在view的部分要在開頭明確寫出接收Model的class
@model myProject.Models.product 類似這樣

ViewData
在Action輸入值時這樣使用 跟session差不多

public ActionResult DemoViewData(){
    ViewData["Name"]="LAWLIET";
    return View();
}
//-----Action View分隔線--------
//在View印出字串時直接向下面這樣寫
@ViewData["Name"]

ViewBag
在Action這樣使用

public ActionResult DemoViewBag(){
    //ViewData["Name"]="LAWLIET";
    ViewBag.Name="LAWLIET"
    return View();
}
//-----Action View分隔線--------
//在View印出字串時向下面這樣寫
@ViewBag.Name

第一次使用時覺得蠻炫的,居然可以變成屬性輸入
除了輸入的方式之外,其他部分個人覺得和ViewData是一樣的

TempData

public ActionResult DemoTempData(){
    TempData["Name"]="LAWLIET";
    return View();
}
//-----Action View分隔線--------
//在View印出字串時直接向下面這樣寫
@TempData["Name"]

其實讀取跟輸入值的方式跟viewData是一樣的
但因為他本身特性,常常會使用於顯示錯誤訊息上,或是一些只須出現一次的訊息
下面再簡單講一下區別

ViewBag,ViewData,TempData
這三種,我個人感覺很像阿,尤其前兩者根本是一模一樣...
至少新手如我,目前還感受不出他們兩個的差異
前兩個與TempData比較大的差異是
viewBag跟viewData都只能存活在一個Action內!
只有TempData可以跨Action傳值!
只有TempData可以跨Action傳值!
只有TempData可以跨Action傳值!

這句話很重要所以說三遍!
之前蠢蠢的想用viewBag跨action傳遞,結果怎麼都讀不到
最後發現是自己蠢了,只有TempData可以跨Action傳值!
阿阿一不小心就說了四次,好的這不是重點,還有一個重點是
TempData雖然可以跨Action傳值,但是他預設的生命週期是一次的讀取
若是都沒有去讀取他,那他就會跟session一樣,時間到就消失(預設是20分鐘)
所以如果需要重複讀取TempData資料,記得讀取後要立刻延長他的壽命
TempData.Keep();
這樣簡單的一行就可以延長TempData的讀取
若是需要指定保留某個值的話可以使用TempData.Keep(string Key);

好的~
這次很認真的把四種傳遞方式都說明一次了!
下次來說View傳值給Controller的方式!


上一篇
從零開始的MVC開發-Controller與View的對話
下一篇
從零開始的MVC開發-Controller對View的喊話(2)
系列文
我的30天MVC從零到不知道多少學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言