在Asp.Net MVC中可以用DropDownListFor的方式來讓用戶選擇已定列表中的一個數值。用法不復雜,這里簡單做一個記錄。
- 首先我們要定義一個 Model ,用戶在 DropDownList 中選擇指定的值賦給屬性 ReadyTimeHour
public class EricSunModel { public string ReadyTimeHour { get; set; } }
- Model定義完畢之后,接下來處理Controller的邏輯
- 【注:這里用了ViewData來記錄DropDownList中所要顯示的所有列表數值】
public ActionResult EricSunAction() { EricSunModel esModel = new EricSunModel(); esModel.ReadyTimeHour = "00"; GenerateReadyTimeViewData(); return View(esModel); } private void GenerateReadyTimeViewData() { ViewData["HourList"] = GetTimeHourList(); } private List<SelectListItem> GetTimeHourList() { List<SelectListItem> hourList = new List<SelectListItem>(); for (int i = 0; i < 24; i++) { if (i < 10) { hourList.Add(new SelectListItem { Text = "0" + i.ToString(), Value = "0" + i.ToString() }); } else { hourList.Add(new SelectListItem { Text = i.ToString(), Value = i.ToString() }); } } return hourList; }
- 接下來我們在View中可以用下面一行代碼來綁定DropDownList
- 【注:第一個參數為綁定Model中的屬性,即-->要為此屬性賦值】
- 【注:第二個參數為DropDownList的所有數據源】
@Html.DropDownListFor(m => m.ReadyTimeHour, ViewData["HourList"] as List<SelectListItem>)
- 截圖如下所示

- 如果我們想在DropDownList中的最頂端添加一個默認值的話,請模仿下面的寫法:添加第三個參數
@Html.DropDownListFor(m => m.ReadyTimeHour, ViewData["HourList"] as List<SelectListItem>, "---Select---")
- 截圖如下所示:

- 這里涉及到如何緩存DropDownList的所有數值問題(特別是提交表單,驗證不通過,需要再次返回本頁面的情況),如下假設Model中包含屬性ReadyTimeHourList(是一個List<SelectListItem>),由於頁面中沒有控件對此數據進行綁定,那么在提交表單之后傳回給action的model中將收集不到此數值,我們用HiddenFor在頁面中去緩存List的數值是不能成功的(將括號中的值換作ViewData["HourList"]也是行不通的),原因是HiddenFor只能緩存單個數值
@Html.HiddenFor(m => m.ReadyTimeHourList)
- 既然用頁面控件緩存的方式行不通,如果解決上述問題呢?請看如下代碼,如果驗證不能通過,那么需要重新綁定ViewData["HourList"]的數值
- 【實際上這里涉及到了ViewData生命周期的問題,由於提交表單之后,代碼進入了如下的Action中,超出了原來的ViewData的聲明周期,因此原來保存的ViewData的值將失效,所以需要再次的重新綁定】
[HttpPost] public ActionResult EricSunAction(EricSunModel model) { if (!ModelState.IsValid) { GenerateReadyTimeViewData(); return View(model); } // model.ReadyTimeHour; return RedirectToAction("OtherActionName"); }
- 這里提供另外的一個常用知識點:ViewBag 與 ViewData 以及 TempData 的區別。請看如下鏈接:
http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications
