2011-12-16 10 views
16
@Html.CheckBox("orderNumbers", new { value = 1 }) 
@Html.CheckBox("orderNumbers", new { value = 2 }) 
@Html.CheckBox("orderNumbers", new { value = 3 }) 
@Html.CheckBox("orderNumbers", new { value = 4 }) 
@Html.CheckBox("orderNumbers", new { value = 5 }) 

[HttpPost] 
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { } 

[HttpPost] 
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { } 

Jeśli użyję pierwszego podpisu w mojej metodzie działania, otrzymam pusty IEnumerable.Powiąż checkboxes z int array/wyliczalnymi w MVC

Jeśli korzystam z drugiego podpisu, otrzymuję wartości, ale otrzymuję również wartość false dla niewybranych wartości (z powodu wzoru MVC shadowingu wszystkich pól wyboru z ukrytym polem).

np. Otrzymam coś w rodzaju: orderNumbers = { "1", "2", "false", "4", "false" }

Dlaczego nie mogę uzyskać listy numerów?

Odpowiedz

8

W ten sposób działa dostarczony pomocnik CheckBoxFor.

Musisz wygenerować kod HTML sam dla pól wyboru. Następnie ukryte dane wejściowe nie są generowane, a otrzymasz tylko wybrane liczby całkowite.

+0

Rzeczywiście, oczywiście ja. Co za idiota! Błędnie założyłem, że zrobiliby coś sprytnego w segregatorze, aby zignorować fałszywe wartości, gdyby nie mogli być związani z żądanym typem. – fearofawhackplanet

23

Możesz uzyskać wszystkie sprawdzone wartości w następujący sposób.

kod Kontroler:

public ActionResult Index() 
    {    
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(string[] orderNumbers) 
    { 
     return View(); 
    } 

Zobacz Kod:

@using (Html.BeginForm()) 
{ 
    <input name="orderNumbers" type="checkbox" value="1" /> 
    <input name="orderNumbers" type="checkbox" value="2" /> 
    <input name="orderNumbers" type="checkbox" value="3" /> 
    <input name="orderNumbers" type="checkbox" value="4" /> 
    <input name="orderNumbers" type="checkbox" value="5" /> 

    <input type="submit" name="temp" value="hi" /> 
} 

Proszę zachować jedną rzecz w moim umyśle, że trzeba dać taką samą nazwę dla wszystkich pól wyboru. W tablicy otrzymasz wartości dla wszystkich zaznaczonych pól wyboru.

5

Oprócz wspaniałej odpowiedzi alok_dida. Ponieważ wszystkie wartości są liczbami całkowitymi, możesz mieć swój kod kontrolera przyjmować tablicę liczb całkowitych i unikać wykonywania konwersji samemu.

Działa to w MVC4 +:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(int[] orderNumbers) 
{ 
    return View(); 
}