项目的思考

1、需求

从多个comtree批量选择符合条件的选项。

2、现状

存在多个comtree,绑定数据的id及text,无批量操作。

 //comtree位置
@foreach (var info in Model.SubStationInfos) { <div class="form_row"> <div class="form_label"> <label>@info.SubStationName</label> </div> <div> @{ Html.RenderAction("StockMultiple", "Controls", new { subStationSysNo = info.SubStationSysNo, name = "ddl_Stock_" + info.SubStation                          SysNo, selectedValue = info.ReceiptStock }); } </div> </div> //ation   public ViewResult StockMultiple(int subStationSysNo, String name, IEnumerable<int> selectedValue)   {     var stockList = _client.Get<StockFilterResponse>("/Stock");     var stockRelationList = _client.Get<StockRelationFilterResponse>(String.Format("/StockRelation?SubStationSysNo={0}", subStationSysNo));     var query = from obj in stockRelationList.Entities     join stock in stockList.Entities on obj.StockSysNo equals stock.SysNo     select new { id = stock.SysNo, text = HttpUtility.UrlEncode(stock.StockName) };     ViewBag.Json = JsonSerializer.SerializeToString(query, query.GetType());     ViewBag.Name = name;     ViewBag.SelectedValue = selectedValue.Join(",");     return View("Controls/MultipleDropDownList");   } //view <input id="@ViewBag.Name" name="@ViewBag.Name" class="easyui-combotree" panelheight="88" multiple /> <script type="text/javascript" language="javascript"> $(function () { $("#@ViewBag.Name").combotree({ onLoadSuccess: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); if ('@ViewBag.SelectedValue' != '') { var arr = $.trim('@ViewBag.SelectedValue').split(','); $("#@ViewBag.Name").combotree('setValues', arr); } }, onHidePanel: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); }, onChange: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) { $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); $("#@ViewBag.Name").combotree("clear"); } } }); $("#@ViewBag.Name").combotree("loadData", $.parseJSON('@Html.Raw(HttpUtility.UrlDecode((string)ViewBag.Json))')); }) </script>

3、解决思路

1)获取数据源,数据源每条记录存在标识属性。

2)数据转换为json格式返回并绑定到对应的comtree。

 

3)根据标识批量勾选符合条件的数据

4、解决方案

方案1、对于实现,很自然的想到将数据绑定到comtree,再在前段对comtree进行遍历操作。

1)该方案问题是每条数据都必须有三个属性需要绑定(id,text,flag),而对于comtree仅能提供id及text绑定,如何将flag也能绑定到对应的选项中是个问题。

原本打算是将数据id及flag按照某规则合并再绑定到comtree的id属性中(text用于显示),到前段再进行分解,实验许久,发觉会对原有的业务有影响以及操作会变的复杂,无法解决。

2)不直接使用comtree,自己拼接html组装为comtree,就可以多个赋值,不过本身对于前段技术不大熟悉及时间紧促,想想还是放弃。

方案2、根据条件在服务端组装好数据再重新绑定到comtree。

1)使用comtree的reload(查看html元素实际使用iframe)的方法重新加载数据,不过想不出方案设置默认值。

var url = "/Controls/GetStockMultiple?subStationSysNo=" + subStationSysNo+"&clothesType="+ ctype;
var stocks=sObj.combotree("reload",url);

2)服务端将数据源及默认值赋值到json实例,并返回该json实例,前段再通过ajax获取data,再对comtree重新loadData。

  [HttpPost]   
        public JsonResult GetStockMultiple(int subStationSysNo, int clothesType)
        {
            var stockList = _client.Get<StockFilterResponse>("/Stock");
            var stockRelationList = _client.Get<StockRelationFilterResponse>(String.Format("/StockRelation?SubStationSysNo={0}", subStationSysNo));
            var query = from obj in stockRelationList.Entities
                        join stock in stockList.Entities on obj.StockSysNo equals stock.SysNo
                        select new { id = stock.SysNo, text = stock.StockName, isCommonStock = stock.IsCommonStock };
            var selectedValue = new ArrayList();
            foreach (var s in query)
            { 
                if(s.isCommonStock==clothesType)
                    selectedValue.Add(s.id);
            }

            return Json(
                             new
                             {
                                 selectedValue = selectedValue,
                                 stocks = query,
                                 status = 0,
                             }
                        );
        }


function selectClothes(ctype)
    {       
        var stockList = $("[id^=ddl_Stock_]");
        for (var i = 0; i < stockList.length; i++) {
            var sObj = stockList.eq(i);
            var index = sObj.attr("id").lastIndexOf('_');
            var subStationSysNo = sObj.attr("id").substring(index + 1);
            var dataObj={subStationSysNo:subStationSysNo, clothesType:ctype};
            $.ajax({
                url: "/Controls/GetStockMultiple",
                dataType: "json",
                contentType: "application/json",
                type: "POST",
                async:false,
                data:  JSON.stringify(dataObj),
                success: function (data) {
                    if(data.status==0)
                    {
                        sObj.combotree("loadData", data.stocks);
                        if(data.selectedValue.length!=0)
                        {
                            sObj.combotree('setValues', data.selectedValue);
                        }
                        else
                        {
                            sObj.combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString');
                        }
                    }
                }
            });
        }
        //不提交
        return false;
    }

注意点:对多个comtree绑定数据,而ajax默认为异步的,所以会导致数据错乱,需要将async属性设置为false,进行同步绑定。

5、总结

1、不要钻牛角尖,发现某个方案暂时无法解决问题,换个思路。

2、多请教别人,在讨论的过程中发现解决方案,有可能别人一句话就能解决,而你需要花几个小时。

3、多积累,不能只是照搬。

posted @ 2013-05-23 15:45  觉夜  阅读(415)  评论(0编辑  收藏  举报