這一篇,回到Controller常常需要做的一件事情,那就是當如果欄位屬於下拉式選單的時候,需要準備好下拉式清單的資料。
如果用的是預設的方式去產生下拉式選單其實有很多問題,這一篇想透過框架的方式,讓產生下拉式清單的資料能夠自動化。
同步發表於我的部落格:http://alantsai2007.blogspot.com/2014/10/BuildYourOwnApplicationFrameworkOnMvc-19-GenerateSelectListFroDropDownList.html
預設Scaffolding的問題
如果是Mvc Scaffolding內建的話,會在Controller的時候產生下拉式清單資料並且塞到ViewBag裡面。
這個最大的問題是:假設某一個地方有需要下拉式選單的資料,但是忘記產生了(最長發生這個問題是在Edit的時候,驗證失敗需要重新顯示View的時候),畫面就會炸掉。
而且這個只有在runtime的時候才會發生,完全沒有辦法在compile的時候檢測出來。
假設有東西能夠保證需要下拉式清單的資料的時候,一定會產生出來,就不需要擔心到底有沒有忘記呼叫要把資料塞到ViewBag裡面。
這就是我們框架要解決的問題。
解決思路
首先,需要下拉式清單的資料的時候,就需要產生出來。能夠確認每一次需要的時候就會產生,就要透過Filter來做。
如 果透過Filter來處理產生的邏輯,那麼還需要準備資料給Filter,讓它產生對應的資料並且塞到ViewBag裡面。因此,ViewModel是最 適合的,因為在Filter裡面可以取得ViewModel的內容,因此可以做一個特殊的欄位,專門存放這些準備資料。
最後,在顯示的部份,就可以用一般的HtmlHelper產生即可。
實作內容
接下來就看看如何實作。
SelectListViewModel的定義
首先,定義一個SelectListViewModel的Class,這個Class將代表需要產生的下拉式選單:
/// <summary>
/// 代表一個要被產生的SelectList
/// </summary>
public class SelectListViewModel
{
/// <summary>
/// 取得或設定此SelectList要和那個ViewModel Property對應
///...