zoukankan      html  css  js  c++  java
  • MVC 下拉列表三级联动

          当前所做的项目,关于数据库设计的时候有点小意思,表A是三个联合主键,key1,key2,key3,表B是四个联合主键 key1,key2,key3,key4,其中表B的联合外键关联表A对应的联合主键,其实这种情况是很多的,比如常见的 省、市、区 三级菜单。这样一来,对表B做新增的时候 就需要几个小步骤:

    ①:界面初始化,返回下拉列表 key1(distinct)、key2(只赋值初始值)、key3(只赋值初始值)

    ②:界面勾选key1,触发chang事件,采用getJson 方式将参数key1的值发送到Action中 ,同时设置下拉列表b 的内容为空,$("#b").html('');

    控制器做处理后,返回 key2的集合

    ③:界面的回调函数中,给下拉列表b 用append 的方式加入 value 值 和 文本值
    ④:界面勾选key2,触发change事件,采用getJson 方式将参数key1、key2 的值发送到Action中,同样设置下拉列表c的内容为空,$("#c").html('');
    控制器做处理后,返回key3的集合

    ⑤:界面回调函数中,给下拉列表c 用append的方式加入 value 值 和文本值

    ⑥:判断key4 是否在表B中存在,不存在,插入数据,返回提示

    从着手项目以来,最开始总想用代码来说明,虽然最后是实现了功能,但回过头看起来,简直是惨不忍睹,实在是有删除从写的冲动,越来越久,才发现,先考虑清楚逻辑,就是深度思考是第一步,虽然说起来很容易,往往实践起来很难

    --主表TMain   从表TMinor
    use TestBook
    alter table TMinor
    add constraint Tminor_fk  foreign key(Key1,Key2,Key3)  references TMain(Key1,Key2,Key3)

    第一步: 将三级联动的下拉列表封装到一个类中

        public class TMainResult
        {
            /// <summary>
            /// 一级下拉框
            /// </summary>
            public string Key1 { get; set; }
    
            /// <summary>
            /// 二级下拉框
            /// </summary>
            public string Key2 { get; set; }
    
            /// <summary>
            /// 三级下拉框
            /// </summary>
            public string Key3 { get; set; }
        }

    第二步:在控制器中设置列表值,并在前台展示

      public ActionResult Index()
            {
                //绑定Key1       //GetKey1() 得到表中 key1栏位集合           
                ViewBag.List_Key1 = new SelectList(dbhelper.GetKey1.ToList(), "Key1", "Key1").AsEnumerable();
                //Key2、Key3 赋空值
                List<ThreeDrop> selectlist = new List<ThreeDrop>();
                ViewBag.List_Key2 = new SelectList(selectlist, "Key2", "Key2").AsEnumerable();
                ViewBag.List_Key3 = new SelectList(selectlist, "Key3", "Key3").AsEnumerable();
                return View();
            }
    <div>
        @using (Html.BeginForm("Index"))
        {
            <label>一级菜单(省份)</label>
            @Html.DropDownList("Key1", ViewBag.List_Key1 as IEnumerable<SelectListItem>,'请选择')
            <p></p>
            <label>二级菜单(地级市)</label>
            @Html.DropDownList("Key2",ViewBag.List_Key2 as IEnumerable<SelectListItem>,'请选择')
            <p></p>
            <label>三级菜单(区、县)</label>
            @Html.DropDownListFor(m=>m.Key3,ViewBag.List_Key3 as IEnumerable<SelectListItem>,'请选择')
        }
    </div>

    第三步: 后台写好返回的数据

            //實現二級連動
            public JsonResult GetKey2Bykey1(string key1)
            {
                List<ThreeDrop> ConfigTypelist = dbhelper.GetKey2(key1).ToList();
                return Json(ConfigTypelist, JsonRequestBehavior.AllowGet);
            }
    
            //實現三級聯動
            public JsonResult GetKey3Bykey2(string key1, string key2)
            {
                List<ThreeDrop> ConfigMSTlist = dbhelper.GetKey3(key1, key2).ToList();
                return Json(ConfigMSTlist, JsonRequestBehavior.AllowGet);
            }

    第四步: 前台发送Ajax请求,并解析后台返回的数据

    <script>
        $(function () {
            //一级联动
            $("#Key1").change(function () {
                var url = "/Test/GetKey2/?Key1=" + $("#Key1").val() + "";
                $.getJSON(url, function (data) {
                    $("#Key2").html('');
                    $("#Key2").append("<option value=''>请选择</option>");
                    $.each(data, function (i,item) {
                        $("#Key2").append("<option value='"+item.Key2+"'>"+item.Key2+"</option>");
                    })
                });
            })
            //二级联动
            $("#Key2").change(function () {
                var url = "/Text/GetKey3/?Key1="+$("#Key1").val()+"&&Key2="+$("#Key2").val()+"";
                $.getJSON(url, function (data) {
                    $("#Key3").html('');
                    $("#Key3").append("<option value=''>请选择</option>");
                    $.each(data, function () {
                        $("#Key3").append("<option value='"+$("#Key3")+"'>'"+$("#Key3")+"'</option>");
                    })
    
                })
            })
    
        })
    </script>

    这样以来,我们前台就只需要判断,key1 和key2 的value值不能为空 就可以得到一组正确三级数据值,那么在后台接收的时候,就通过封装一个新增 model实体类 直接传值到后台进行处理,至于先判断Key4是否在B表中是否有重复值,这就是不是重点了,总之大致思路就是这样。

     为什么第一次加载界面的二三级下拉列表值为空?

        因为联动是 触发change() 事件,只有鼠标点选了下拉列表才会触发,如果上来二三级下拉列表也绑定,那么点选一后,二自动变换,此时再去点选三,就不是二联动过去

  • 相关阅读:
    706. Design HashMap 实现哈希表
    5. Longest Palindromic Substring 返回最长的回文子串
    8. String to Integer (atoi) 字符串转成整数
    22. Generate Parentheses产生所有匹配括号的方案
    245. Shortest Word Distance III 单词可以重复的最短单词距离
    java之spring之初始spring
    java之hibernate之hibernate缓存
    java之hibernate之hibernate查询
    java之hibernate之加载策略和抓取策略
    java之hibernate之 cascade和inverse
  • 原文地址:https://www.cnblogs.com/Sientuo/p/6790790.html
Copyright © 2011-2022 走看看