2010-03-04 16 views
8

Wie verknüpfen Sie eine MultiSelectList mit einer Liste von Kontrollkästchen?ASP.NET MVC: Render Checkbox Liste von MultiSelectList

z. Ich übergebe so etwas an das Modell

model.Groups = new MultiSelectList(k.Groups, "Id", "Name", selectedGroups) 

Wie soll ich es rendern? Das funktioniert nicht

<% foreach (var item in Model.Groups.Items) { %> 
    <input type="checkbox" name="groups" value="<%=item.Value%>" id="group<%=item.Value%>" checked="<%=item.Selected?"yes":"no"%>" /> 
    <label for="group<%=item.Value%>"><%=item.Text%></label> 
<% } %> 

CS1061 Fehler: 'Objekt' enthält keine Definition für 'Value' enthält ...

Gibt es eine HTML-Helper-Methode, die ich verwenden kann?

(Dann, es sei denn, es einfach ist, wie soll ich dann die ausgewählten Werte wieder auf die Steuerung erhalten, wenn das Formular abgeschickt wird?)

+0

Wie müssen Sie diese Gruppen in der Steuerung? Wäre es ausreichend, wenn Sie gerade Gruppen-IDs aus dem Formular erhalten hätten? –

+0

Ich muss nur wissen, ob sich die Auswahlen geändert haben (dh. Welche werden geprüft, wenn das Formular abgeschickt wird). Aber noch wichtiger ist, wie die Kontrollkästchen machen – Aximili

Antwort

18

ich getestet nur zu sehen, wie wir, wenn die Auswahl geändert wurde sehen.

public class Group { 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

//And some data to play with 
var allGroups = new List<Group>(); 
allGroups.Add(new Group { ID = 1, Name = "one" }); 
allGroups.Add(new Group { ID = 2, Name = "two" }); 
allGroups.Add(new Group { ID = 3, Name = "three" }); 

var selectedGroups = new List<Group>(); 
selectedGroups.Add(allGroups[0]); 
selectedGroups.Add(allGroups[2]); 

var m = new MultiSelectList(allGroups, "ID", "Name", 
    selectedGroups.Select(x => x.ID)); 

//passed that data to the view with ViewData 
ViewData["list"] = m; 

Die Checkbox Elemente:

<% foreach (var item in (MultiSelectList)ViewData["list"]) { %> 
    <input type="checkbox" name="groups" value="<%=item.Value%>" 
     id="group<%=item.Value%>" 
     <%=item.Selected ? "checked=\"checked\"" : String.Empty%>/> 
    <label for="group<%=item.Value%>"><%=item.Text%></label> 
<% } %> 

ein int-Array in der Aktion angenommen:

[HttpPost] 
public ActionResult SomeAction(int[] groups) { 
    if (groups != null) { 
     var postedSelection = allGroups.Where(x => groups.Contains(x.ID)); 
     if (!selectedGroups.SequenceEqual(postedSelection)) { 
      //selection was changed 
     } 
     else { 
      //selection is the same 
     } 
    } 
    else { 
     //no group ID was posted 
    } 
} 

Ich hoffe, dass eine Vorstellung gibt.

+0

ich sehen, so sollte es foreach (var Artikel in Model.Groups) statt foreach (var Artikel in Model.Groups.Items) sein Danke cagdas ! – Aximili

2

Ich wollte nur meine Implementierung mit dem Beispiel von oben teilen. Ich befülle Eigenschaften, die in Schlüssel/Wert-Paaren in meiner Datenbank organisiert sind. In meinem Beispiel speichere ich jede Eigenschaft als Schlüsselwertpaar in einem Dictionary. Jedes Element im Wörterbuch wird einen String-Schlüssel wie "Farbe" enthält und eine MultiSelectList mit Werten wie Datavaluefield = "1", Datatextfield = "Black" etc ...

VewModel-Code

public Dictionary<string, MultiSelectList> Properties { get; private set; } 

    private void SetProperties() 
    { 
     this.Properties = new Dictionary<string, MultiSelectList>(); 

     foreach(InventoryItemProperty property in new InventoryItemPropertyRepository().FindAllInventoryItemProperties()) 
     { 
      this.Properties.Add(property.Key.Name, new MultiSelectList(property.Values, "Id", "Value")); 
     } 
    } 

anzeigen

Markup
<div id="editor-inventory-item-properties"> 
     <% foreach(string key in Model.Properties.Keys){ %> 
      <div class="editor-label"> 
       <label for="<%= key.ToLower() %>"><%= key %></label><br /> 
       <% foreach(var item in Model.Properties[key]){ %> 
        <input type="checkbox" 
         id="<%= key.ToLower() + "-" + item.Text.ToLower() %>" 
         name="inventoryItemPropertyValues" 
         value="<%= item.Value %>" 
         <%= item.Selected ? "checked=\"checked\"" : string.Empty %> /> 
        <label for="<%= key.ToLower() + "-" + item.Text.ToLower() %>"> 
        <%= item.Text %></label><br /> 
       <% } %> 
      </div> 
     <% } %> 
    </div> 

Controller Aktion Code

// 
    // POST: /Admin/InventoryItems/Create 

    [HttpPost] 
    public ActionResult Create(InventoryItem inventoryItem, int[] inventoryItemPropertyValues) 
    { 
     try 
     { 
      inventoryItem.Created = DateTime.Now; 
      inventoryItem.LastUpdated = inventoryItem.Created; 
      this.inventoryItemRepository.Add(inventoryItem); 
      this.inventoryItemRepository.Save(); 

      if(inventoryItemPropertyValues != null) 
      { 
       SaveInventoryItemPropertyValues(inventoryItem.Id, inventoryItemPropertyValues); 
      } 

      return RedirectToAction("Details", new { id = inventoryItem.Id }); 
     } 
     catch 
     { 
      throw; 
      //return View(); 
     } 
    } 
private void SaveInventoryItemPropertyValues(int inventoryItemId, int[] inventoryItemPropertyValues) 
    { 
     for(int i = 0; i < inventoryItemPropertyValues.Length; i++) 
     { 
      this.inventory_Item_ProperytValueRepository.Add(new Inventory_Item_PropertyValue() { InventoryItemId = inventoryItemId, InventoryItemPropertyValueId = inventoryItemPropertyValues[i] }); 
     } 

     this.inventory_Item_ProperytValueRepository.Save(); 
    } 
Verwandte Themen