2015-08-20 15 views
5

mam problem i nie mogę znaleźć rozwiązania. Używam maszynki Razor i jest to moja klasa VieModel.wiele pól wyboru w maszynce (używając 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; } 
} 

Widok:

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

Kontroler:

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

Po przedstawienia "ToExport", w kontrolerze, każda grupa ma zawsze wartość 'false'. Nawet jeśli wszystkie grupy są sprawdzane.

Czy ktoś może mi pomóc? Co robię źle?

+0

jaki sposób dane przychodzą do was w modelu (param). Może powinieneś sprawdzić nazwę checkbox-html. –

Odpowiedz

8

Nie można użyć foreach pętli do generowania formantów dla kolekcji. HTML, który generujesz dla każdego pola wyboru (i dla powiązanego ukrytego wejścia), to <input type="checkbox" name="item.ToExport" .../>. Twój model nie zawiera właściwości o nazwie item.

Użyj for pętlę

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

Teraz twój HTML będzie

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

itd., Które będą prawidłowo wiązać modelu

Edycja

Alternatywnie można użyj custo m EditorTemplate dla typeof GroupToExport. Tworzenie częściowy widok /Views/Shared/EditorTemplates/GroupToExport.cshtml

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

A potem w głównym widoku

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

Sposób EditorFor() wygeneruje poprawną html dla każdego elementu w swojej kolekcji na podstawie szablonu.

+0

'Nie możesz użyć pętli foreach' - Możesz użyć' EditorFor' w pętli w prawo? – ediblecode

+0

@jumpingcode jeśli używasz szablonu edytora dla typeof 'GroupToExport' The nie trzeba (i nie powinien być używany) do' foreach' pętlę - jej będzie tylko '@ Html.EditorFor (m => m. ExportingGroups) ' –

+0

zgadzam, ale dokonaniu zamiatanie oświadczenie, że nie jest technicznie prawdziwe – ediblecode

4

Używasz Niepoprawna składnia do mapowania wartości z powrotem, gdy są one wysłane, ponieważ sprawdzana wartość wyboru jest zainicjowane false domyślnie, że jest powód, dlaczego jest zawsze fałszywe, korzystanie 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 

To powinno odwzorować wszystkie wartości, których szukasz.

Powiązane problemy