Uwaga: to pytanie ma ponad dziewięć lat!
Najlepszą opcją jest wyszukiwanie nowszych pytań lub wyszukiwanie poniższych odpowiedzi w poszukiwaniu konkretnej wersji MVC, ponieważ wiele odpowiedzi tutaj jest już nieaktualnych.
Jeśli znajdziesz odpowiedź, która działa dla Twojej wersji, upewnij się, że zawiera ona wersję używanego MVC.
(Oryginalne pytanie zaczyna się poniżej)
Wydaje mi się to trochę dziwne, ale o ile wiem, tak to robisz.
Mam kolekcję obiektów i chcę, aby użytkownicy wybrali jeden lub więcej z nich. To mówi do mnie „formularz z polami wyboru”. Moje obiekty nie mają pojęcia „wybranego” (są to podstawowe POCO utworzone przez deserializację wywołania wcf). Więc wykonuję następujące czynności:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
W widoku:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
I w kontrolerze to jedyny sposób, w jaki mogę zobaczyć, jakie obiekty sprawdził użytkownik:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
Jest dziwaczny, a po drugie, w przypadku elementów, które sprawdził użytkownik, FormCollection podaje jego wartość jako „prawda fałsz”, a nie tylko prawda.
Oczywiście czegoś mi brakuje. Myślę, że jest to zbudowane z myślą o tym, że obiekty w kolekcji, na które działa się w formularzu HTML, są aktualizowane przy użyciu UpdateModel()
lub za pośrednictwem ModelBinder.
Ale moje obiekty nie są do tego skonfigurowane; Czy to oznacza, że to jedyny sposób? Czy jest na to inny sposób?
źródło
Odpowiedzi:
Html.CheckBox robi coś dziwnego - jeśli wyświetlisz źródło na wynikowej stronie, zobaczysz,
<input type="hidden" />
że obok każdego pola wyboru generowane jest źródło , które wyjaśnia „prawdziwe fałszywe” wartości, które widzisz dla każdego elementu formularza.Wypróbuj to, co zdecydowanie działa na ASP.NET MVC Beta, ponieważ właśnie go wypróbowałem.
Umieść to w widoku zamiast używać Html.CheckBox ():
Wszystkie pola wyboru są wywoływane
selectedObjects
, avalue
każde pole wyboru jest identyfikatorem GUID odpowiedniego obiektu.Następnie opublikuj następującą akcję kontrolera (lub coś podobnego, co robi coś użytecznego zamiast Response.Write ())
Ten przykład po prostu zapisze identyfikatory GUID zaznaczonych pól; ASP.NET MVC mapuje wartości GUID wybranych pól wyboru do
Guid[] selectedObjects
parametru dla Ciebie, a nawet analizuje ciągi z kolekcji Request.Form w utworzonych obiektach GUID, co moim zdaniem jest całkiem miłe.źródło
HtmlHelper dodaje ukryte dane wejściowe, aby powiadomić kontroler o statusie niezaznaczonym. Aby mieć poprawny status sprawdzony:
źródło
Jeśli zastanawiasz się, DLACZEGO wstawiają ukryte pole o tej samej nazwie co pole wyboru, powód jest następujący:
Komentarz z kodu źródłowego MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs
Myślę, że za kulisami muszą to wiedzieć, aby powiązać parametry z metodami działania kontrolera. Mógłbym wtedy mieć trójstanowy stan logiczny, jak przypuszczam (związany z nollable parametrem bool). Nie próbowałem tego, ale mam nadzieję, że tak właśnie zrobili.
źródło
Powinieneś także użyć,
<label for="checkbox1">Checkbox 1</label>
ponieważ wtedy ludzie mogą kliknąć tekst etykiety, a także samo pole wyboru. Łatwiej jest również stylizować i przynajmniej w IE zostanie podświetlony, gdy będziesz przechodzić między kartami kontrolnymi strony.To nie jest tylko kwestia „och, mógłbym to zrobić”. Jest to znacząca poprawa komfortu użytkowania. Nawet jeśli nie wszyscy użytkownicy wiedzą, że mogą kliknąć etykietę, wielu z nich to zrobi.
źródło
Dziwię się, że żadna z tych odpowiedzi nie wykorzystała do tego wbudowanych funkcji MVC.
Napisałem blogu na ten temat tutaj , który nawet faktycznie łączy etykiet do wyboru. Użyłem EditorTemplate folder do osiągnięcia tego w czystym i sposób modułowy.
Po prostu skończy się nowy plik w folderze EditorTemplate, który wygląda następująco:
w twoim rzeczywistym widoku nie będzie potrzeby zapętlać tego, wystarczy 1 linia kodu:
Odwiedź mój wpis na blogu, aby uzyskać więcej informacji.
źródło
+1
i + piwoOto co robiłem.
Widok:
Kontroler:
Znalazłem, że metody pomocnicze HTML. * Nie są tak przydatne w niektórych przypadkach i że lepiej byłoby, gdybym robił to w zwykłym starym HTML. Jest to jeden z nich, drugi przychodzi na myśl przyciski radiowe.
Edycja: dotyczy wersji zapoznawczej 5, oczywiście między wersjami YMMV.
źródło
Wygląda na to, że zdecydowali się czytać tylko pierwszą wartość, więc jest to „prawda”, gdy pole wyboru jest zaznaczone, i „fałsz”, gdy zawarta jest tylko wartość ukryta. Można to łatwo pobrać za pomocą takiego kodu:
źródło
@Dylan Beattie Great Find !!! Bardzo ci dziękuję Aby jeszcze bardziej rozwinąć tę technikę, działa ona również doskonale w podejściu Model widoku. MVC jest tak fajny, że jest wystarczająco inteligentny, aby powiązać tablicę prowadnic z właściwością o tej samej nazwie obiektu Model powiązanego z widokiem. Przykład:
ViewModel:
Widok:
Kontroler:
Każdy, kto zna filozofię View Model, będzie się cieszył, działa to jak Bohater!
źródło
Chciałbym również zauważyć, że możesz nazwać każde pole wyboru inną nazwą i włączyć tę nazwę do parametrów akcji działania.
Przykład,
Widok:
Kontroler:
Wartości z widoku są przekazywane do akcji, ponieważ nazwy są takie same.
Wiem, że to rozwiązanie nie jest idealne dla twojego projektu, ale pomyślałem, że przedstawię ten pomysł.
źródło
Z kontrolera:
źródło
Ten problem występuje również w wersji 1.0. Html.Checkbox () powoduje dodanie innego ukrytego pola o tej samej nazwie / identyfikatorze, co oryginalne pole wyboru. A gdy próbowałem załadować tablicę pól wyboru za pomocą document.GetElemtentsByName (), możesz zgadywać, jak się sprawy popsuły. To dziwne.
źródło
Z tego, co mogę zebrać, model nie chce zgadywać, czy zaznaczone = prawda czy fałsz, obejrzałem to, ustawiając atrybut wartości elementu checkbox za pomocą jQuery przed przesłaniem formularza w następujący sposób:
W ten sposób nie potrzebujesz ukrytego elementu tylko do przechowywania wartości pola wyboru.
źródło
Wiem, że to pytanie zostało napisane, gdy MVC3 nie było dostępne, ale dla każdego, kto podejdzie do tego pytania i używa MVC3, możesz chcieć „poprawnego” sposobu na zrobienie tego.
Chociaż myślę, że to robi całość
rzecz jest świetna i czysta i działa na wszystkich wersjach MVC, problem polega na tym, że nie bierze pod uwagę kultury (tak jakby to naprawdę miało znaczenie w przypadku bool).
„Prawidłowym” sposobem obliczenia wartości bool, przynajmniej w MVC3, jest użycie ValueProvider.
Robię to w jednej z witryn mojego klienta, kiedy edytuję uprawnienia:
Teraz piękno tego polega na tym, że możesz używać tego z dowolnym prostym typem, a nawet będzie on poprawny w oparciu o kulturę (pomyśl o pieniądzach, liczbach dziesiętnych itp.).
ValueProvider jest używany podczas tworzenia akcji w następujący sposób:
ale gdy próbujesz dynamicznie budować te listy i sprawdzać wartości, nigdy nie poznasz identyfikatora w czasie kompilacji, więc musisz je przetwarzać w locie.
źródło
Najłatwiej to zrobić ...
Ustawiasz nazwę i wartość.
<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name
Następnie po przesłaniu chwyć wartości pól wyboru i zapisz w tablicy int. następnie odpowiednia funkcja LinQ. Otóż to..
źródło
Tak jak odpowiedź nautic20, po prostu użyj domyślnej listy pól wyboru wiązania modelu MVC o takiej samej nazwie jak właściwość kolekcji string / int / enum w ViewModel. To jest to.
Ale należy zwrócić uwagę na jedną kwestię. W każdym elemencie pola wyboru nie należy umieszczać w nim „Id”, co wpłynie na wiązanie modelu MVC.
Poniższy kod będzie działał dla wiązania modelu:
Poniższe kody nie będą wiążące dla modelu (tutaj różnica polega na przypisaniu identyfikatora do każdego pola wyboru)
źródło
to właśnie zrobiłem, aby utracić podwójne wartości podczas korzystania z Html.CheckBox (...
z 4 zaznaczonymi polami, niezaznaczone, niezaznaczone, zaznaczone zmienia się w true, false, false, false, true, false w true, false, false, true. dokładnie to, czego potrzebowałem
źródło
Co powiesz na coś takiego?
źródło
Korzystając z pola wyboru HtmlHelper, zdecydowanie wolę pracować z opublikowanymi danymi formularza pola wyboru jako tablicą. Naprawdę nie wiem dlaczego, wiem, że inne metody działają, ale myślę, że po prostu wolę traktować ciągi rozdzielone przecinkami jak najwięcej tablic.
Zatem wykonanie „sprawdzonego” lub prawdziwego testu byłoby:
Wykonanie fałszywej kontroli byłoby:
Główną różnicą jest użycie,
GetValues
ponieważ zwraca jako tablicę.źródło
Po prostu zrób to na
$(document).ready
:źródło
Moje rozwiązanie to:
Więcej można znaleźć tutaj: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized-as-a- valid-boolean /
źródło
Miałem prawie ten sam problem, ale zwracana wartość mojego kontrolera została zablokowana innymi wartościami.
Znalazłem proste rozwiązanie, ale wydaje się nieco szorstkie.
Spróbuj wpisać
Viewbag.
kontroler, a teraz nadasz mu nazwę „jak”Viewbag.Checkbool
Teraz przejdź do widoku i spróbuj tego
@Viewbag.Checkbool
, uzyskując wartość z kontrolera.Moje parametry kontrolera wyglądają następująco:
a moje pole wyboru zaktualizuje się w następujący sposób:
źródło
Korzystając z @mmacaulay, wymyśliłem to dla bool:
Jeśli zaznaczone aktywne = prawda
Jeśli niezaznaczone aktywne = false
źródło