我有一個應用程序幾乎相同的行爲,並選擇了相同的技術。但是,我的ViewModel包含List1和List2。
呼喚我的編輯模板做這樣的:
<div id="SoftwarePanel" class="collapsiblePanel">
<h2>Request Software</h2>
@Html.EditorFor(m => m.Software)
</div>
「軟件」,在這種情況下,是包含「AvailableItems」和「RequestedItems」性質的「RequestableList」類的一個實例。編輯器模板呈現出兩個彼此相鄰的列表,放置適當的按鈕用於在列表框之間來回移動項目並連接到javascript。
<table>
<tr>
<td>
<input type="text" id="[email protected]{@name}Filter" />
<button type="button" id="[email protected]{@name}Clear" class="DualList_availClear dualListButton"">
X</button><br />
@Html.ListBoxFor(m => m.AvailableItems, new MultiSelectList((from i in Model.AvailableItems where !Model.RequestedItems.Contains(i.Key) select i), "Key", "Value"), new { @class = "dualList" })
<br />
<span id="[email protected]{@name}Counter" class="countLabel"></span>
<select id="[email protected]{@name}Storage">
</select>
</td>
<td>
<button id="[email protected]{@name}" type="button" class="dualListButton">
></button><br />
<button id="[email protected]{@name}" type="button" class="dualListButton">
>></button><br />
<button id="[email protected]{@name}" type="button" class="DualList_Allto1 dualListButton">
<<</button><br />
<button id="[email protected]{@name}" type="button" class="dualListButton">
<</button><br />
</td>
<td>
<input type="text" id="@{@name}RequestedFilter" />
<button type="button" id="@{@name}RequestedClear" class="DualList_requestClear dualListButton">
X</button><br />
@Html.ListBoxFor(m => m.RequestedItems, new MultiSelectList((from i in Model.RequestedItems select new { key = i, value = Model.AvailableItems[i] }).AsEnumerable(), "key", "value"), new { @class = "dualList" })
<br />
<span id="@{@name}RequestedCounter" class="countLabel"></span>
<select id="@{@name}RequestedStorage">
</select>
</td>
</tr>
</table>
更新:我使用由Justin Mead開發的DualListBox插件。 http://www.meadmiracle.com/dlb/DLBDocumentation.aspx
<script type="text/javascript">
$(function() {
$.configureBoxes({
box1View: '@ViewData.TemplateInfo.GetFullHtmlFieldId("AvailableItems")',
box1Storage: '[email protected]{@name}Storage',
box1Filter: '[email protected]{@name}Filter',
box1Clear: '[email protected]{@name}Clear',
box1Counter: '[email protected]{@name}Counter',
box2View: '@ViewData.TemplateInfo.GetFullHtmlFieldId("RequestedItems")',
box2Storage: '@{@name}RequestedStorage',
box2Filter: '@{@name}RequestedFilter',
box2Clear: '@{@name}RequestedClear',
box2Counter: '@{@name}RequestedCounter',
to1: '[email protected]{@name}',
to2: '[email protected]{@name}',
allTo1: '[email protected]{@name}',
allTo2: '[email protected]{@name}',
onItemsChanged: function() {
var opts = $('#@ViewData.TemplateInfo.GetFullHtmlFieldId("RequestedItems") option');
var optIds = $.map(opts, function(e) { return $(e).val(); });
}
});
});
</script>
@Shwan,謝謝你分享你的方法。我可能無法在兩者之間進行連線,因爲源列表逐頁不同。如果可能的話,你可以發佈你的javascript嗎? – Sunny
我看不到如何根據頁面變化的源列表會導致問題。發送視圖渲染時,渲染視圖的動作不會簡單地將不同的數據加載到視圖模型中嗎?就我而言,我的視圖模型中實際上有4個不同的「RequestableItem」屬性。每個都有不同的來源。 – Shawn
它確實會加載數據,但用戶可以通過ajax將數據填充到源列表中。正如我所提到的,它不是列表框,它的第三方控件,所以我不能將其「select」事件追加到任何特定的事件中。它不同的頁面。 – Sunny