MVC實現多選下拉框,保存並顯示多選項


在"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>
}

 

運行,在沒有選擇任何項時的界面如下:

3


當選擇項,提交后,重新返回/Fan/SaveCars.cshtml視圖,界面如下:

4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM