2010-03-04 16 views
8

¿Cómo asocia una MultiSelectList con una lista de casillas de verificación?ASP.NET MVC: lista de casilla de verificación de Render de MultiSelectList

por ejemplo. Paso algo como esto al modelo

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

¿Cómo debo renderizarlo? Esto no funciona

<% 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> 
<% } %> 

error CS1061: 'objeto' no contiene una definición para 'Valor' ...

¿Existe un método HTML ayudante que puedo usar?

(Entonces, a menos que sea sencillo, ¿cómo debo a continuación, obtener los valores seleccionados de nuevo en el controlador cuando se envía el formulario?)

+0

¿Cómo se necesitan esos grupos en el controlador? ¿Sería suficiente si acaba de recibir ID de grupo del formulario? –

+0

Solo necesitaré saber si las selecciones han cambiado (es decir, cuáles se verifican cuando se envía el formulario). Pero lo más importante cómo representar las casillas de verificación – Aximili

Respuesta

18

solo he probado para ver cómo podemos ver si la selección se ha cambiado.

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; 

Los elementos de casillas de verificación:

<% 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> 
<% } %> 

aceptado una int matriz en la acción:

[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 
    } 
} 

espero que da una idea.

+0

que veo, lo que debe ser foreach (var elemento en Model.Groups) en lugar de foreach (var elemento en Model.Groups.Items) Gracias cagdas ! – Aximili

2

Solo quería compartir mi implementación usando el ejemplo de arriba. Estoy poblando propiedades que están organizadas en pares clave/valor en mi base de datos. En mi ejemplo, guardo cada propiedad como un par de valores clave en un Diccionario. Cada elemento en el diccionario contendrá una clave de cadena como "color" y una MultiSelectList con valores como DataValueField = "1", DataTextField = "Negro", etc ...

Código VewModel

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")); 
     } 
    } 

Ver marcado

código
<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> 

Acción controlador

// 
    // 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(); 
    } 
Cuestiones relacionadas