2015-07-10 15 views
5

Sto lavorando a un'applicazione MVC in cui la classe Modello Item ha un AvailableColours come proprietà.Modello MVC con un elenco di oggetti come proprietà

AvailableColours è un sottoinsieme definito dall'utente delle classi Colour. Vorrei visualizzare tutte le istanze Colour in un elenco di caselle di controllo e, quando inviato, AvailableColours è un List<Colour> contenente le classi selezionate Colour.

Qual è il modo migliore per farlo in MVC?

Modifica: Il mio codice finora, anche se ritengo che questo non sia il modo più MVC-ish per farlo!

Modello

public class Item 
{ 
    public int ID { get; set; } 
    public List<Colour> AvailableColours { get; set; } 
} 

View

@model MyNamespace.Models.Item 
@using MyNamespace.Models; 
@{ 
    ViewBag.Title = "Create"; 

    var allColours = new List<Colour>(); //retrieved from database, but omitted for simplicity 
} 

<h2>Create New Item</h2> 

@using (Html.BeginForm("Create", "Item", FormMethod.Post)) 
{ 
    <div> 
     @Html.LabelFor(model => model.AvailableColours) 

     @foreach (var colour in allColours) 
     { 

      <input type="checkbox" name="colours" value="@colour.Description" /> 
     } 
    </div> 

    <input type="submit" value="Submit" /> 
} 

controller

[HttpPost] 
public ActionResult Create(Item item, string[] colours) 
{ 
    try 
    { 
     foreach (var colour in colours) 
     { 
      item.AvailableColours.Add(GetColour(colour));//retrieves from database 

      return RedirectToAction("Index"); 
     } 
    } 
    catch 
    { 
     return View(); 
    } 
} 

risposta

18

I modelli

public class Item 
{ 
    public List<Colour> AvailableColours { get;set; } 
} 

public class Colour 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 
    public bool Checked { get; set; } 

} 

Annotare il Checked proprietà

View per ciclo

@using (Html.BeginForm("Create", "Item", FormMethod.Post)) 
{ 
    <div> 
    @Html.LabelFor(model => model.AvailableColours) 
    @for(var i = 0; i < Model.AvailableColours.Count; i++) 
    {  

     @Html.HiddenFor(m => Model.AvailableColours[i].ID) 
     @Html.HiddenFor(m => Model.AvailableColours[i].Description) 
     @Html.CheckBoxFor(m => Model.AvailableColours[i].Checked) 
     @Model.AvailableColours[i].Description<br/> 
    } 
    </div> 
<input type="submit" value="Submit" /> 
} 

nota il ciclo for invece di foreach per consentire vincolante modello ed i campi nascosti per consentire i valori a essere rinviato al controller

Model Binding To A List

controller inviare

[HttpPost] 
public ActionResult Create(Item model) 
{ 
    //All the selected are available in AvailableColours 

    return View(model); 
} 
+0

Qual è il valore di 'Model.Items'? Vedi la mia modifica - Sto estraendo l'elenco completo dei colori dal database e consentendo all'utente di scegliere un sottoinsieme, che è memorizzato nella proprietà 'AvailableColours'. – PTuckley

+0

@PTuckley Scusa, era un errore di battitura. La proprietà è 'AvailableColours'. L'ho anche adattato per adattarlo a ulteriori dettagli che non avevi incluso nella domanda in origine. – hutchonoid

+0

Ho paura che questo non abbia ancora molto senso per me - di che tipo è il modello nella tua risposta? C'è un riferimento a 'Model.AvailableColours' nella dichiarazione di ciclo' for', ma un riferimento a 'Model [i] .ID' nel campo nascosto? – PTuckley

Problemi correlati