2015-08-20 20 views
5

Ho un problema e non riesco a trovare una soluzione. Sto usando Razor ed è la mia classe VieModel.Checkbox multipli nel rasoio (utilizzando foreach)

public class GroupToExport 
{ 
    public GroupToExport() 
    { 
     ToExport = false; 
    } 

    [DisplayName("Export")] 
    public bool ToExport { get; set; } 
    public Group Group { get; set; } 

} 

public class GroupsToExport 
{ 
    public GroupsToExport() 
    { 
     //refill list 
    } 

    public List<GroupToExport> ExportingGroups { get; set; } 
} 

Vista:

@using (Html.BeginForm("Export", "ElmahGroup", FormMethod.Post, new { id = "toExportForm" })) 
{ 
//some divs 
    <input type="submit" id="js-export-submit" value="Export" /> 
@foreach (var item in Model.ExportingGroups) 
       { 
        <tr> 
         <td class="js-export-checkbox"> 
          @Html.CheckBoxFor(modelItem => item.ToExport) 
         </td> 
        </tr> 
       } 
//some divs 
} 

Controller:

public ActionResult Export(GroupsToExport model) 
    { 
     var groupsToExport = model.ExportingGroups.Where(x => x.ToExport).Select(x => x); 
     throw new System.NotImplementedException(); 
    } 

Dopo presentare "ToExport", in Controller, ogni gruppo ha sempre valore 'false'. Anche se tutti i gruppi sono controllati.

Qualcuno può aiutarmi? Cosa sto facendo di sbagliato?

+0

Come vengono visualizzati i dati nel modello (param). Forse dovresti controllare il nome della casella di controllo-html. –

risposta

8

Non è possibile utilizzare un ciclo foreach per generare controlli per una raccolta. L'html che stai generando per ogni checkbox (e per l'input nascosto associato) è <input type="checkbox" name="item.ToExport" .../>. Il modello non contiene una proprietà denominata item.

Utilizzare un ciclo for

@for(int i = 0; i < Model.ExportingGroups.Count; i++) 
{ 
    <tr> 
    <td class="js-export-checkbox"> 
     @Html.CheckBoxFor(m => m.ExportingGroups[i].ToExport) 
    </td> 
    </tr> 
} 

Ora il codice HTML sarà

<input name="ExportingGroups[0].ToExport" .../> 
<input name="ExportingGroups[1].ToExport" .../> 

ecc che sarà correttamente legarsi al modello

Modifica

In alternativa è possibile usa un custo m EditorTemplate per il tipo di GroupToExport. Creare una vista parziale /Views/Shared/EditorTemplates/GroupToExport.cshtml

@model yourAssembly.GroupToExport 
<tr> 
    <td class="js-export-checkbox"> 
    @Html.CheckBoxFor(m => m.ToExport) 
    </td> 
</tr> 

E poi nella vista principale

@Html.EditorFor(m => m.ExportingGroups) 

Il metodo EditorFor() genererà il codice HTML corretto per ogni elemento nella vostra collezione in base al modello.

+0

'Non è possibile utilizzare un ciclo foreach' - È possibile se si utilizza un' EditorFor' all'interno del ciclo giusto? – ediblecode

+0

@jumpingcode, Se si utilizza un modello di editor per typeof 'GroupToExport', non è necessario (e non dovrebbe essere utilizzato) un ciclo' foreach' - sarebbe solo '@ Html.EditorFor (m => m. ExportingGroups) ' –

+0

Sono d'accordo, ma hai fatto un'affermazione che non è tecnicamente vera – ediblecode

4

Si sta utilizzando la sintassi corretta per mappare i valori di nuovo qualora siano fornite, in quanto il valore controllato di una casella di controllo è inizializzato su false per impostazione predefinita, questo è il motivo per cui è sempre falso, uso sysntax

@for(int i = 0; i < Model.ExportingGroups.Count(); i++) 
      { 
       <tr> 
        <td class="js-export-checkbox"> 
         @Html.CheckBoxFor(modelItem => Model.ExportingGroups[i].ToExport) 
        </td> 
       </tr> 
      } 
//some divs 

Questo dovrebbe riportare indietro tutti i valori che stai cercando.