プロジェクトの考え方
18997 ワード
1、需要
複数のcomtreeから条件を満たすオプションを一括して選択します.
2、現状
複数のcomtreeが存在し、データをバインドするidおよびtextがあり、一括操作はありません.
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を表示)を使用してデータを再ロードしますが、スキーマ設定のデフォルト値は思いつきません.
2)サービス側はデータソースとデフォルト値をjsonインスタンスに割り当て、そのjsonインスタンスに戻り、前段でajaxでdataを取得し、comtreeに対してデータを再loadDataする.
注意:複数のcomtreeにデータをバインドし、ajaxはデフォルトで非同期であるため、データが乱れ、asyncプロパティをfalseに設定して同期バインドする必要があります.
5、まとめ
1、頭を悩まないで、ある案がしばらく問題を解決できないことを発見して、考え方を変えます.
2、多くの人に教えてもらって、討論の過程で解決策を発見して、他の人の一言で解決することができるかもしれませんが、あなたは何時間もかかります.
3、積み重ねて、そのままではいけない.
複数の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、積み重ねて、そのままではいけない.