2009-06-23 17 views
11

Próbuję modelować powiązać zestaw generowanych dynamicznie pola wyboru tak, aby przetworzyć je w akcji kontrolera, ale nie można uzyskać wiążącej do modelu pojawić się. To jest scenariusz:ASP.NET MVC - model wiążących zestaw wyboru generowanych dynamicznie - jak

Moja klasa ViewModel (DocumentAddEditModel) zawiera słownik (Słownik < ciąg, bool>) z ciągiem każdego wpisu będącego nazwą/etykietą dla każdego pola wyboru i wartością logiczną wskazującą, czy pole wyboru jest zaznaczone:

public class DocumentAddEditModel 
    { 
     ... 
     private Dictionary<string, bool> _categoryCheckboxes = new Dictionary<string,bool>(); 
     ... 

     ... 
     public Dictionary<string, bool> CategoryCheckboxes 
     { 
      get { return _categoryCheckboxes; } 
      set { _categoryCheckboxes = value; } 
     } 
     ... 
    } 
} 

w moim kontroler akcji, który obsługuje żądania GET dla formularza zapełnia dictonary następująco:

public class DocumentsController : Controller 
{ 
    [RequiresAuthentication] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Add() 
    { 
     DocumentAddEditModel documentAddEditModel = new DocumentAddEditModel(); 
     ... 
     Dictionary<string, bool> categoryCheckboxes = new Dictionary<string, bool>(); 
     ... 
     string[] categories = Enum.GetNames(typeof(Category)); 

     foreach (string category in categories) 
      categoryCheckboxes.Add(category, false); 

     documentAddEditModel.CategoryCheckboxes = categoryCheckboxes; 

     return View(documentAddEditModel); 
    } 
} 

w widoku mam następujący generować pola wyboru:

<% foreach (KeyValuePair<string, bool> categoryCheckbox in ViewData.Model.CategoryCheckboxes) 
    {%> 
    <input class="checkbox" type="checkbox" name="CategoryCheckboxes[0].Key" id="<%= categoryCheckbox.Key %>" /> 
    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label> 
<% } %> 

ale myślę, że to tutaj musi być problem. Nie wiem, co musi być w atrybucie nazwy. Problem polega na tym, że gdy pisał z powrotem do następującej metody działania w DocumentsController:

[RequiresAuthentication] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Add(DocumentAddEditModel documentAddEditModel) 
{ 
    ... 
} 

documentAddEdit.Model.CategoryCheckboxes zawsze ma wartość null. Jak mogę to ustawić tak, że słownik CategoryCheckboxes jest prawidłowo wypełniona nazwy i sprawdzone/niezaznaczone wartość bool dla pola wyboru?

Dzięki

Odpowiedz

10

Jeśli są wiążące swoich pól wyboru do Dictionary<string, bool> spróbuj tego:

<% var i = 0; %> 
<% foreach (KeyValuePair<string, bool> categoryCheckbox in Model.CategoryCheckboxes) {%> 

    <input type="hidden" name="<%= String.Format("CategoryCheckboxes[{0}].Key", i) %>" value="<%= categoryCheckbox.Key %>" /> 
    <%= Html.CheckBox(String.Format("CategoryCheckboxes[{0}].Value", i), categoryCheckbox.Value) %> 

    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label> 

    <% i++; %> 
<% } %> 

Nadzieja to pomaga

AKTUALIZACJA:

o wiązanie z IDictionary<T1, T2> swoją postać musi zawierają dane wejściowe z "CategoryCheckboxes [n] .Key" i "CategoryCheckbo Xes [n] .Value”nazw/identyfikatorów ID, w którym n musi być zera i nieprzerwana.

+0

Dzięki eu-ge-ne, które wydaje się zrobić podstęp, czy mógłbyś wyjaśnić, co tu się dzieje? Rozumiem, że ponieważ kontrolka checkbox ( Matthew

+0

znowu sobie sprawę, że w HTML.CheckBox() htmlhelper generuje drugie ukryte pole z atrybutem nazwy równym atrybutowi widocznego pola wyboru, ale gdy porównuję wygenerowany html dla pola wyboru, gdy nie jest zaznaczone: – Matthew

+0

Matthew

1

ukryte elementy są modus operandi ASP.NET. w wersji WebForms to był ViewState, który był ogromny ukryte pole, w MVC jego lżejsze bardziej proste ukrytych pól na kontrolę. Nie jestem pewien, co jest w tym złego lub niepokojącego. W jakiś sposób musisz zachować stan, możesz to zrobić po stronie klienta lub po stronie serwera. Proponuję po stronie klienta dla niewrażliwych informacji, że droga będzie nadal istnieje, jeśli serwer zostanie ponownie uruchomiony między postbacks itp

0

coś prostszego:

@foreach (var pair in Model.CategoryCheckboxes) 
{ 
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key]) 
} 
Powiązane problemy