在"MVC實現多選下拉框"中,主要是多選下拉框的顯示,而實際情況通常是:選擇多個選項提交后,需要在編輯頁把所有選中的項顯示出來。
模擬這樣的一個場景:一個車迷可能有多個自己喜歡的汽車品牌。
關於車迷的Model:
namespace MvcApplication1.Models { public class CarFan { public int Id { get; set; } public string Name { get; set; } public string[] SelectedCars { get; set; } } }
以上,在"MVC實現多選下拉框"中也提到了,當我們通過<select multiple="multiple"...></select>顯示多選下拉框的時候,其對應的Model屬性類型一定是string[]。
關於汽車品牌的Model:
namespace MvcApplication1.Models { public class Car { public int Id { get; set; } public string Name { get; set; } } }
創建FanController:
using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using MvcApplication1.Models; namespace MvcApplication1.Controllers { public class FanController : Controller { public ActionResult SaveCars() { var carFan = new CarFan() {Id = 1, Name = "Darren", SelectedCars = {}}; ViewBag.allcars = GetAllCars(); return View(carFan); } [HttpPost] public ActionResult SaveCars(CarFan carFan) { //if (ModelState.IsValid) //{ // foreach (var item in carFan.SelectedCars) // { // //TODO:把選中的Car的編號和CarFan保存到中間表 // } //} ViewBag.allcars = GetAllCars(); return View(carFan); } private IEnumerable<SelectListItem> GetAllCars() { List<SelectListItem> allCars = new List<SelectListItem>(); allCars.Add(new SelectListItem() { Value = "1", Text = "奔馳" }); allCars.Add(new SelectListItem() { Value = "2", Text = "寶馬" }); allCars.Add(new SelectListItem() { Value = "3", Text = "奇瑞" }); allCars.Add(new SelectListItem() { Value = "4", Text = "比亞迪" }); allCars.Add(new SelectListItem() { Value = "5", Text = "起亞" }); allCars.Add(new SelectListItem() { Value = "6", Text = "大眾" }); allCars.Add(new SelectListItem() { Value = "7", Text = "斯柯達" }); allCars.Add(new SelectListItem() { Value = "8", Text = "豐田" }); allCars.Add(new SelectListItem() { Value = "9", Text = "本田" }); return allCars.AsEnumerable(); }
顯示<select multiple="multiple"...></select>的時候,需要一個IEnumerable<SelectListItem>類型的集合,我們通過ViewBag把該類型集合傳遞到前台視圖。
打上[HttpPost]的SaveCars(CarFan carFan)方法內部,在實際項目中,本該是需要遍歷所有選中汽車品牌的Id,把CarFan的Id和汽車品牌的Id保存到兩者的中間表的,但這里為了方便,保存成功后還是回到原先的/Fan/SaveCars.cshtml視圖,把選中的項顯示出來。
/Fan/SaveCars.cshtml 視圖
@model MvcApplication1.Models.CarFan @{ ViewBag.Title = "SaveCars"; Layout = "~/Views/Shared/_Layout.cshtml"; } <link href="~/Content/chosen.css" rel="stylesheet" /> <h2>@Model.Name 感興趣的汽車品牌包括:(最多選擇2個)</h2> @using (Html.BeginForm("SaveCars", "Fan", FormMethod.Post, new {id="editForm"})) { @Html.ListBoxFor(m => m.SelectedCars, (IEnumerable<SelectListItem>)ViewBag.allcars, new {@class="chosen", multiple="multiple", style="width:350px;"}) <br/> <input type="submit" value="提交"/> } @section scripts { <script src="~/Scripts/chosen.jquery.min.js"></script> <script type="text/javascript"> $(function() { $('.chosen').chosen({ max_selected_options: 2 }); $(".chosen-deselect").chosen( { allow_single_deselect: true }); $(".chosen").chosen().change(); $(".chosen").trigger('liszt:updated'); }); </script> }
運行,在沒有選擇任何項時的界面如下:
當選擇項,提交后,重新返回/Fan/SaveCars.cshtml視圖,界面如下: