老生常谈,记一个联动菜单

     已经有好久没有写博客了,写起来还有点小激动。不多说了,就直接上个实站记录,记录一下mvc中controller和jquery结合实现一个二级联动菜单的事务。
     效果如下图所示:
     
       实现起来,其实并不难,首先说第一个下拉框,用到了ViewBag,由controller写方法填充一个动态对象变量,在.cshtml里对该对象进行遍历。

private void BindSelect(int? shopId = null)
        {
            List<Shop> shops = new List<Shop>();
            //这里就假设说取到的商户对象的列表,并且商户对象有属性ShopID和Name要做为下拉菜单选项的Value和Text
            if (shopId == null)
                ViewBag.ShopID = new SelectList(shops, "ShopID", "Name");
            else
                ViewBag.ShopID = new SelectList(shops, "ShopID", "Name", shopId.Value);
        }

       再来看一下.cshtml里对ViewBag的处理。

                    <select id="ShopID" name="ShopID" class="form-control">
                        <option value="0">请选择</option>
                        @if (ViewBag.ShopID != null)
                        {
                            foreach (var item in (SelectList)ViewBag.ShopID)
                            {
                                <option value="@item.Value">@item.Text</option>
                            }
                        }
                    </select>

      这样就完成了第一个下拉框。下面再来看一下第二个下拉框,HTML极其简单。Look.

                    <select id="WifiID" name="WifiID" class="form-control">
                       <option value="0">请选择</option>
                    </select>

     这里要注意,因为jquery要操作html上的标签,必须知道操作的标签对象是哪一个,所以这里必须定义好标签的Id或者name又或者class等等一些足以让jquery选择器较精确地定位到你要操作的那个标签上。下面看一下js代码也是比较简单的,就算是我记录一下吧。绑定一下第一个下拉框的change事件,将第一个下拉框的选中值以post方式提交给controller。

<script type="text/javascript">
    $(function () {
        $("#ShopID").change(function () {
            $.ajax({
                url: "@Url.Action("GetWifi", "BlackWhite")",
                type: "POST",
                data: { "id": $(this).val() },
                success: function (data) {
                    if (data) {
                        $("#WifiID").empty();
                        $("#WifiID").append($("<option>").val(0).text("请选择"));
                        for (var i = 0; i < data.length; i++) {
                            $("#WifiID").append($("<option>").val(data[i].Value).text(data[i].Text));
                        }
                    }
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert("错误:" + textStatus);
                },
                complete: function (XMLHttpRequest, textStatus) {
                    //alert("完成:" + textStatus);
                }
            });
        });
    });
</script>

    这里可以很清晰地看到,要调用的controller,action,以及要用的httpMethod.最后,再来看一下controller对这个请求的处理。

     

        [HttpPost]
        public ActionResult GetWifi(int id)
        {
            if (id > 0)
            {
                var lists = db.Wifi.ToList();
                return Json(new SelectList(lists, "WifiID", "Name"));
            }
            return Json(new SelectList(db.Wifi.ToList(), "WifiID", "Name"));
        }

 

再回过头去看上上段的JS代码,在success那里,如果对象不为undefined,在那里作了处理,首先把第二个下拉框的选项清空,防止重复加载,然后加入请选择选项,再就是遍历action返回来的值,最终把值填充进第二个下拉框。
     以上就完成了。好久没写日志了,先从简单的记录起来。走起。。。OVER

posted @ 2014-05-29 20:18  浪客是剑心  阅读(308)  评论(0编辑  收藏  举报