Posted in Javascript onSeptember 02, 2013
上次项目中遇到一个需要多个下拉列表联动的操作,今天有空将实现方式整理以便以后参考。
要达到的效果是,点击一个下拉框,则另一个下拉框的值发生对应变化。如:选择中国,则另个一下拉框里显示中国各个省份。
传统的HTML方式比较简单,实际上基于MVC的实现方式也大同小异。
直接上代码:
public class DP_Provice { public int proviceID { get; set; } public string ProviceName { get; set; } public int ProviceNode { get; set; } public virtual List<DP_City> citySource { get; set; } } public class DP_City { public int CityNode { get; set; } public string CityName { get; set; } public string ProviceNode { get; set; } }
对以上涉及到的实体类予以赋值,暂时使用一个静态类初始化简单数据:
public static class DPDataSource { public static List<DP_Provice> InitalData() { List<DP_Provice> source = new List<DP_Provice> { new DP_Provice{ ProviceNode=1, ProviceName="北京", citySource=new List<DP_City>{ new DP_City{ CityNode=11, CityName="北京海淀" }, new DP_City{ CityNode=12,CityName="北京西城" } }}, new DP_Provice{ ProviceNode=2, ProviceName="山东", citySource=new List<DP_City>{ new DP_City{ CityNode=21, CityName="济南" }, new DP_City{ CityNode=22,CityName="德州" } }}, new DP_Provice{ ProviceNode=3, ProviceName="河北", citySource=new List<DP_City>{ new DP_City{ CityNode=31, CityName="石家庄" }, new DP_City{ CityNode=32,CityName="衡水" } }} }; return source; } }
具体在Controller中的调用,因为使用的JQuery中的AJAX方式,所以返回的结果类型为Json;
public ActionResult Index() { return View("DPShow"); } List<DP_Provice> source = DPDataSource.InitalData(); public JsonResult GetProvinceSource() { if (source == null || source.Count < 0) { source = DPDataSource.InitalData(); } return Json(source, JsonRequestBehavior.AllowGet); } public JsonResult GetCitySource(string proviceName) { source = DPDataSource.InitalData(); List<DP_City> citySource = new List<DP_City>(); citySource = source.Where(a => a.ProviceNode.ToString().Contains(proviceName)).First().citySource; return Json(citySource, JsonRequestBehavior.AllowGet); }
数据准备完毕,此时需要Razor视图中进行绑定和展示,代码如下:
@model MvcApplication.Models.DP_Provice @{ ViewBag.Title = "DPShow"; Layout = "~/Views/Shared/_Layout.cshtml"; } <script type="text/javascript"> $(function myfunction() { GetPlant(); //初始化省份数据 $("#ddlProvince").change(function ff() { //设置当省份下拉列表发生变化时,更新城市数据列表 GetCity(); }); }); function GetPlant() { $("#ddlProvince").empty(); var url = "/Dropdown/GetProvinceSource/"; $.getJSON(url, function (data) { $.each(data, function (i, item) { $("<option></option>") .val(item["ProviceNode"]) .text(item["ProviceName"]) .appendTo($("#ddlProvince")); }); GetCity(); }); } function GetCity() { $("#ddlCity").empty(); var temp=$("#ddlProvince").val(); var url ="@Url.Action("GetCitySource", "Dropdown")" ; //使用MVC3中Url.Action 方法参数依次为:aciton ; controller ; area ; $.getJSON(url,{"proviceName":temp}, function (data) { //中间需要用到参数 所以采用在getJSON方法中实现 $.each(data, function (i, item) { $("<option></option>") .val(item["CityNode"]) .text(item["CityName"]) .appendTo($("#ddlCity")); }); }); } </script> <! DOCTYPE html /> <h2> 下拉列表联动</h2> <table> <tr> <td> <select id="ddlProvince" /> </td> <td> <select id="ddlCity" /> </td> </tr> </table>
说明:
一般来讲,采用MVC实现下拉列表绑定可以有多种方式,主要是数据绑定方式可以使用JQuery中的Ajax 方式,同时也可以使用自定义的基于MVC 的 Url.Acion 方式,个人建议使用基于MVC 的 Url.Acion。
一来是支持方式比较灵活,如果中间涉及到数据类型复杂,可以自定义,实现数据封装;
二来是JQuery 中URL在传递参数时需要格式化,否则将无法找到指定的Action。
如有大家对上述说法有异议或者更好的实现方案,请给予指正或说明,谢谢。
基于MVC3方式实现下拉列表联动(JQuery)
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@