プロジェクトの考え方

18997 ワード

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)を必要とする3つの属性が必要であり、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、積み重ねて、そのままではいけない.