2012-08-31 35 views
0

我的應用程序中有許多頁面,其中有兩個添加/刪除項目的列表框選項。如果list1是源,list2是目標,我只需要list2中的項目(新添加/刪除的項目)。所以想知道如何設計編輯器模板。以下是我最初的想法,任何人都可以看到問題(或)提供建議,使其更好。使用添加/刪除項目功能實現兩個列表框的編輯器模板

  1. 在包含所有list2 id的viewmodel中創建一個int []屬性。
  2. 爲此屬性創建一個編輯器模板並創建一個包含指定標識項的列表框。由於list1的源代碼可以是任何東西,或者可以通過AJAX等各種方法填充,所以首選在編輯器模板中只包含list2。
  3. 在編輯器模板中編寫一個JavaScript函數,向其添加newitem,如果已刪除,請提供該項目的源代碼。爲了在提交時提供修改,添加功能會在DOM中創建隱藏字段,並在刪除項目時刪除它們。

注意:他們不是listboxes他們是telerik網格控件,爲了簡單起見,我提到了listboxes但我只是需要id的listbox2。所以,我認爲listbox或gridview沒有區別。

回答

0

我有一個應用程序幾乎相同的行爲,並選擇了相同的技術。但是,我的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"> 
       &gt;</button><br /> 
      <button id="[email protected]{@name}" type="button" class="dualListButton"> 
       &gt;&gt;</button><br /> 
      <button id="[email protected]{@name}" type="button" class="DualList_Allto1 dualListButton"> 
       &lt;&lt;</button><br /> 
      <button id="[email protected]{@name}" type="button" class="dualListButton"> 
       &lt;</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> 
+0

@Shwan,謝謝你分享你的方法。我可能無法在兩者之間進行連線,因爲源列表逐頁不同。如果可能的話,你可以發佈你的javascript嗎? – Sunny

+0

我看不到如何根據頁面變化的源列表會導致問題。發送視圖渲染時,渲染視圖的動作不會簡單地將不同的數據加載到視圖模型中嗎?就我而言,我的視圖模型中實際上有4個不同的「RequestableItem」屬性。每個都有不同的來源。 – Shawn

+0

它確實會加載數據,但用戶可以通過ajax將數據填充到源列表中。正如我所提到的,它不是列表框,它的第三方控件,所以我不能將其「select」事件追加到任何特定的事件中。它不同的頁面。 – Sunny

相關問題