2015-08-20 11 views
5

Ich habe ein Problem und ich kann keine Lösung finden. Ich benutze Razor und es ist meine VieModel-Klasse.Mehrere Kontrollkästchen in Rasierer (mit 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; } 
} 

Ausblick:

@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(); 
    } 

Nach Eintragen "ToExport" in-Controller, jede Gruppe hat immer Wert 'false'. Auch wenn alle Gruppen überprüft werden.

Kann mir jemand helfen? Was mache ich falsch?

+0

Wie kommen die Daten zu Ihnen im Modell (param). Vielleicht solltest du den Namen des checkbox-html überprüfen. –

Antwort

8

Sie können eine foreach-Schleife nicht verwenden, um Steuerelemente für eine Auflistung zu generieren. Der HTML-Code, den Sie für jedes Kontrollkästchen (und für die zugehörige ausgeblendete Eingabe) generieren, lautet <input type="checkbox" name="item.ToExport" .../>. Ihr Modell enthält keine Eigenschaft mit dem Namen item.

Verwenden Sie eine for Schleife

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

Jetzt wird Ihre HTML

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

usw. sein, die korrekt zu Ihrem Modell

bearbeiten

Alternativ binden können Sie benutze ein custo m für typeof GroupToExport. Erstellen Sie eine Teilansicht /Views/Shared/EditorTemplates/GroupToExport.cshtml

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

Und dann in der Hauptansicht

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

Die EditorFor() Methode wird die richtige HTML-Code für jedes Element in Ihrer Sammlung basiert auf der Vorlage erzeugen.

+0

'Sie können keine foreach-Schleife verwenden '- Sie können, wenn Sie eine' EditorFor 'innerhalb der Schleife rechts verwenden? – ediblecode

+0

@jumpingcode, Wenn Sie eine Editorvorlage für typeof 'GroupToExport' verwenden, brauchen Sie (und sollten nicht verwenden) eine 'foreach'-Schleife - das wäre nur' @ Html.EditorFor (m => m. ExportingGroups) ' –

+0

Ich stimme zu, aber Sie haben eine umfassende Aussage gemacht, die technisch nicht wahr ist – ediblecode

4

Sie falsche Syntax verwenden, um die Werte wieder auf der Karte anzeigen, wenn sie gebucht werden, da der aufgegebene Wert einer Checkbox standardmäßig auf false initialisiert wird, dass der Grund, warum es immer falsch ist, verwendet 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 

Dies sollte alle Werte zurückverwandeln, die Sie suchen.

Verwandte Themen