对于级别联动,相信大家都不再陌生。级别联动讲的就是一些级别不同的管理机构,通过选取上一层的组织,显示下面组织的名称。
就好比说,我这里有三个下拉框,我通过第一个下拉框选择了廊坊师范学院,第二个下拉框列表中会出现:物电学院、数信学院等等,而通过我再选取物电学院等,来显示二级学院下的专业等。
概念了解了,那么我们来说逻辑,整体逻辑:
1.加载一级目录的选项。
2.通过选取一级目录下的值,根据id来获取二级目录下的选项。
3.通过选取二级目录下的值,根据id来获取三级目录下的选项。
……以此类推。
刚开始做这一块的时候,我想着怎么去实现它?于是我先用cs做了一遍,逻辑彻底通了,之后我开始用bs做,实现也是没有问题。可是问题来了,我这么做,符不符合需求,怎样才能做活,怎样才能让这个级别联动让大家都可以用,可扩展,可维护?
下面来看看这个在MVC框架中的例子:
1.首先视图view中加载:
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">@*前面参数是调用的方法的名字,后面是控制器名字*@ @{Html.RenderAction("PermissionComBoPartial", "ComTest");}</span></span>2.控制器中部分:
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"> public PartialViewResult PermissionComBoPartial() { //从某处得到权限按钮的Json串,然后拼接成按钮 comboEntity enCombo=new comboEntity { Id1 = "province", Id2 = "city", Id3="county", name ="dept", valueField1="provinceId", textField1="provinceName", Url1 = "GetProvince", Url2 = "GetCity", Url3="GetCounty", par1 = "provinceId", valueField2 = "cityId", textField2="cityName", valueField3="countyId", textField3="countyName", }; ConverEasyUICombobox html = new ConverEasyUICombobox(); ViewData["PermissionCombo"] = html.PermissionCombo(enCombo); return PartialView(); }</span></span>拼接字符串,创建下拉框部分:
<span style="font-size:18px;"> public class ConverEasyUICombobox { /// <summary> /// 拼接权限按钮 /// </summary> /// <param name="list"></param> /// <returns></returns> public StringBuilder PermissionCombo(comboEntity enCombo) { StringBuilder strHtml = new StringBuilder(); //strHtml.Append(ConverEasyUIcombo(enCombo)); //strHtml.Append(ConverEasyUIcombo1(enCombo)); strHtml.Append(ConverEasyUIcombo2(enCombo)); return strHtml; } //#region 转换成 combo //一级下拉框 public string ConverEasyUIcombo(comboEntity enCombo) { StringBuilder strBuilder = new StringBuilder();//放置html代码 strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id1);//加入ID strBuilder.Append("\" class=\"easyui-combobox\" name=\""); strBuilder.Append(enCombo.name); strBuilder.Append("\" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField1);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField1);//显示值 strBuilder.Append("',url:'"); strBuilder.Append(enCombo.Url1);//数据源 strBuilder.Append("'\" />"); return strBuilder.ToString(); } //#endregion //二级下拉框 #region 转换成 combo public string ConverEasyUIcombo1(comboEntity enCombo) { // @*<input id="province" class="easyui-combobox" data-options=" //valueField: 'provinceId', //textField: 'provinceName', //url: 'GetProvince', //onSelect: function(rec){ // $.get('GetCity', { provinceId: rec.provinceId }, function (data) { // $('#city').combobox('clear').combobox('loadData',data); // $('#county').combobox('clear');},'json'); //}"> StringBuilder strBuilder = new StringBuilder();//放置html代码 strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id1);//combobox ID strBuilder.Append("\" class=\"easyui-combobox\" name=\""); strBuilder.Append(enCombo.name); //控件名字 strBuilder.Append("\" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField1);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField1);//显示值 strBuilder.Append("',url:'"); strBuilder.Append(enCombo.Url1);//数据源 strBuilder.Append("',onSelect: function(rec){$.get('"); strBuilder.Append(enCombo.Url2); strBuilder.Append("', {"); strBuilder.Append(enCombo.par1); strBuilder.Append(": rec."); strBuilder.Append(enCombo.valueField1); strBuilder.Append(" }, function (data) {"); strBuilder.Append("$('#"); strBuilder.Append(enCombo.Id2); strBuilder.Append("').combobox('clear').combobox('loadData',data);"); //strBuilder.Append("\"$('#\""); //strBuilder.Append(enCombo.Id3); //strBuilder.Append("'\" />"); //strBuilder.Append("\"').combobox('clear');},'json');\""); strBuilder.Append("},'json');}"); strBuilder.Append("\""); strBuilder.Append(">"); //<input id="county" class="easyui-combobox" data-options="valueField:'countyId',textField:'countyName'">*@ strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id2);//加入ID strBuilder.Append("\" class=\"easyui-combobox\" name=\""); strBuilder.Append(enCombo.name); strBuilder.Append("\" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField2);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField2);//显示值 strBuilder.Append("'\" />"); return strBuilder.ToString(); } #endregion //三级下拉框 #region 转换成 combo public string ConverEasyUIcombo2(comboEntity enCombo) { // @*<input id="province" class="easyui-combobox" data-options=" //valueField: 'provinceId', //textField: 'provinceName', //url: 'GetProvince', //onSelect: function(rec){ // $.get('GetCity', { provinceId: rec.provinceId }, function (data) { // $('#city').combobox('clear').combobox('loadData',data); // $('#county').combobox('clear');},'json'); //}"> StringBuilder strBuilder = new StringBuilder();//放置html代码 strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id1);//combobox ID strBuilder.Append("\" class=\"easyui-combobox\" name=\""); strBuilder.Append(enCombo.name); //控件名字 strBuilder.Append("\" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField1);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField1);//显示值 strBuilder.Append("',url:'"); strBuilder.Append(enCombo.Url1);//数据源 strBuilder.Append("',onSelect: function(rec){$.get('"); strBuilder.Append(enCombo.Url2); strBuilder.Append("', {"); strBuilder.Append(enCombo.par1); strBuilder.Append(": rec."); strBuilder.Append(enCombo.valueField1); strBuilder.Append(" }, function (data) {"); strBuilder.Append("$('#"); strBuilder.Append(enCombo.Id2); strBuilder.Append("').combobox('clear').combobox('loadData',data);"); //strBuilder.Append("\"$('#\""); //strBuilder.Append(enCombo.Id3); //strBuilder.Append("'\" />"); //strBuilder.Append("\"').combobox('clear');},'json');\""); strBuilder.Append("},'json');}"); strBuilder.Append("\""); strBuilder.Append(">"); //<input id="county" class="easyui-combobox" data-options="valueField:'countyId',textField:'countyName'">*@ // <input id="city" class="easyui-combobox" data-options=" // valueField: 'cityId', // textField: 'cityName', // onSelect:function(rec){ // $.get('GetCounty', { cityId: rec.cityId }, function (data) { // $('#county').combobox('clear').combobox('loadData',data); // },'json'); //}"> strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id2);//加入ID strBuilder.Append("\" class=\"easyui-combobox\""); strBuilder.Append("\" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField2);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField2);//显示值 strBuilder.Append("',onSelect: function(rec){$.get('"); strBuilder.Append(enCombo.Url3); strBuilder.Append("', {"); strBuilder.Append(enCombo.valueField2); strBuilder.Append(": rec."); strBuilder.Append(enCombo.valueField2); strBuilder.Append(" }, function (data) {"); strBuilder.Append("$('#"); strBuilder.Append(enCombo.Id3); strBuilder.Append("').combobox('clear').combobox('loadData',data);"); strBuilder.Append("},'json');}"); strBuilder.Append("\""); strBuilder.Append(">"); //<input id="county" class="easyui-combobox" data-options="valueField:'countyId',textField:'countyName'">*@ strBuilder.Append("<input id=\""); strBuilder.Append(enCombo.Id3);//加入ID strBuilder.Append("\" class=\"easyui-combobox\""); strBuilder.Append(" data-options=\"valueField:'"); strBuilder.Append(enCombo.valueField3);//实际值 strBuilder.Append("',textField:'"); strBuilder.Append(enCombo.textField3);//显示值 strBuilder.Append("'\">"); return strBuilder.ToString(); } #endregion }</span>这样我们就可以根据我们查询数据库返回来需要的级别,自己去生成级联下拉框。下面来看看运行效果:
1.单个下拉框的:
2.两个下拉框的:
实现功能简单,但是做到可扩展,运行快,能提高用户体验度就很难了,也许这就是当下社会,实现功能的很多软件,就有那么几款为大多数用户接受的原因吧。
这个级别联动,还有不足之处就是重复代码很多,还需要改进,希望大家能够提供好的建议,一起研究,进步!