摘要:ASP.NET MVC 連動DropDownList
前言
在Web Form時代,我們習慣使用DropDownList控制項,透過AutoPostBack機制,在後端進行連動的控制,十分快速方便。但如今.Net MVC回到了純手工撰寫程式,必需回歸到以前asp的觀念,來達到DropDownList連動效果,本篇就以我習慣處理的方式分享給大家。
DrodownList連動實作
@using (Html.BeginForm("Index", "DropDown", FormMethod.Post, new { name = "form1" }))
{
@Html.DropDownList("group_id1", ViewBag.group_id1 as SelectList, new { onchange = "tab(this)" })
@Html.DropDownList("group_id2", ViewBag.group_id2 as SelectList, new { onchange = "tab(this)" })
}
首先,假設我們有兩個下拉選單要做連動,透過主分類來連動次分類。
View做法:
(1) 建立主、次分類的@Html.DropDownList,並置於Form裡。
(2) 再將下拉選單增加onchange事件,讓被選取的時候去觸發javascript function
(3) 而Javascript function負責執行Form Submit,送至action做處理。
Controller做法:
先建立3個Method:
(1) GetSelectItem - 用來初始化select itme,並可以傳入bool參數來決定是否顯示「請選擇」的字樣。
(2) SetDropDown1 - 用來設定第一下拉選項(主分類)內容,傳入值id為選單預設d 選取值。
(3) SetDropDown2 - 用來設定第二下拉選項(次分類)內容,傳入值id為主份類的選取值;傳入值id2為次分類的選取值。
// 初始化DropDownList
List<<selectlistitem>> GetSelectItem(bool dvalue = true)
{
List<<selectlistitem>> items = new List<<selectlistitem>>();
if (dvalue) { items.Insert(0, new SelectListItem { Text = "--請選擇--", Value = "0" }); }
return items;
}
// 第一層下拉選項
private List<<selectlistitem>> SetDropDown1(int id = -1)
{
List<<selectlistitem>> items = GetSelectItem();
using (DB19113Entities db = new DB19113Entities())
items.AddRange(new SelectList(db.travel_catogory, "id", "title", id));
return items;
}
// 第二層下拉選項
private List<<selectlistitem>> SetDropDown2(int id = -1, int id2 = -1)
{
List<<selectlistitem>> items = GetSelectItem();
using (DB19113Entities db = new DB19113Entities())
{
var query = db.travel_project.Where(m => m.travel_catogory_id == id);
items.AddRange(new SelectList(query, "id", "project", id2));
}
return items;
}
建立完成以上3個Method後,Action的code就變的簡單多了,如以下程式碼所示:
public ActionResult Index()
{
ViewBag.group_id1 = SetDropDown1();
ViewBag.group_id2 = GetSelectItem();
return View();
}
(1) 初始頁面,將ViewBag.group_id1取得分類資料即呼SetDropDown1
(2) 而ViewBag.Group_id2則設定為下拉選單初始的狀態。
[HttpPost]
public ActionResult Index(FormCollection form)
{
int id = 0;
int id2 = 0;
id = int.Parse(form["group_id1"]);
id2 = int.Parse(form["group_id2"]);
ViewBag.group_id1 = SetDropDown1(id);
ViewBag.group_id2 = SetDropDown2(id, id2);
return View();
}
(1) User操作時,在選擇完主分類的選項後,透過form post到action後,可以從FormCollection取得下group_id1(主分類選取值),並將其傳入SetDropDown2,即可取得次分類的選單。
(2) 注意需再重新指定 ViewBag.group_id1 = SetDropDown1(id); ,才能keep住主分類的值。