Pracuję nad aplikacją ASP.NET MVC 4. Ta aplikacja ma podstawową formę. Model mojego formularza wygląda następująco:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
W moim formularzu mam następujący HTML.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Kiedy wysyłam formularz, wartość Remember w modelu jest zawsze fałszywa. Jednak właściwość Name w modelu ma wartość. Przetestowałem to, ustawiając punkt przerwania w następujący sposób:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Nie mogę tego rozgryźć. Dlaczego wartość pola wyboru nie jest ustawiana?
c#
asp.net-mvc-4
JQuery Mobile
źródło
źródło
Odpowiedzi:
Wygeneruje:
Jak to działa:
checkbox
pozostanie niezaznaczone, formularz przesyła tylkohidden
wartość (false)true
dla modelubool
własności<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
To zawsze wyśle wartość domyślną, jeśli jest zaznaczone.
źródło
Ponieważ używasz Model.Name do ustawiania wartości. Zakładam, że przekazujesz pusty model widoku do widoku.
Zatem wartość Remember to false i ustawia wartość elementu checkbox na false. Oznacza to, że po zaznaczeniu tego pola wyboru, w formularzu wysyłasz wartość „false”. Jeśli go nie wybierzesz, nie zostanie opublikowany, więc model domyślnie ma wartość false. Dlatego w obu przypadkach widzisz fałszywą wartość.
Wartość jest przekazywana tylko wtedy, gdy zaznaczysz pole wyboru. Aby zrobić pole wyboru w MVC użyj
lub jeśli nie chcesz wiązać modelu z widokiem.
Mvc robi magię z ukrytym polem, aby zachować wartości, gdy nie są wybrane.
Edytuj, jeśli naprawdę masz awersję do tego i chcesz samodzielnie wygenerować element, możesz to zrobić.
źródło
@Html.CheckboxFor
Kod powinien być rzeczywiście@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
użyłbyś przycisku radiowego? czy nie jest to możliwetype="radio"
i wybierając ten, który chcesz wybrany w HTML jest taka sama jak powyżejchecked="checked"
. Różnica polega na tym, że będziesz mieć wiele<input />
elementów o tej samej nazwie. Musisz dowiedzieć się, do którego z nich zastosować dodatkowy kod HTML.@Html.CheckBoxFor(x => x.Remember)
to zadziałało dla mnieUżywaj tylko tego
źródło
$(this).val($(this).is(":checked"));
Zamiast
posługiwać się:
To da ci pole wyboru specjalnie dla Zapamiętaj
źródło
OK, pole wyboru jest trochę dziwne. Gdy używasz pomocnika HTML, generuje on dwa pola wyboru w znaczniku, a oba z nich są przekazywane jako para nazwa-wartość IEnumerable, jeśli jest zaznaczona.
Jeśli nie jest zaznaczone na znaczniku, zostanie przekazane tylko ukryte wejście, które ma wartość false.
Na przykład na znacznikach masz:
I w akcji kontrolera (upewnij się, że nazwa jest zgodna z nazwą parametru pola wyboru na kontrolerze):
Następnie w kontrolerze możesz zrobić takie rzeczy jak:
Wiem, że to nie jest eleganckie rozwiązanie. Mam nadzieję, że ktoś tutaj może udzielić kilku wskazówek.
źródło
Aby przekonwertować wartość zwróconą z pola wyboru w formularzu na właściwość logiczną, użyłem ValueProviderResult w konwerterze kompilacji w niestandardowym ModelBinder.
źródło
Jeśli pracujesz z FormCollection, a nie z modelem, przypisanie może być tak proste, jak:
źródło
Napotkałem podobny problem i udało mi się odzyskać wartość pola wyboru, używając pola wyboru, ukrytego dla i małego JQuery:
źródło
To był duży ból i wydaje się, że powinno być prostsze. Oto moja konfiguracja i rozwiązanie.
Używam następującego pomocnika HTML:
@Html.CheckBoxFor(model => model.ActiveFlag)
Następnie w administratorze sprawdzam sposób zbierania i przetwarzania formularzy:
źródło
user.IsActive = fc["IsActive"] != "false";
nadal czuję się brudny, robiąc na nim porównanie ciągów.Właśnie wpadłem na to (nie mogę uwierzyć, że się nie włącza / wyłącza!)
W każdym razie!
Opublikuje wartość „on” lub „off”.
To NIE BĘDZIE wiązało się z wartością logiczną, ale możesz zrobić to głupie obejście!
źródło
źródło
Dla MVC przy użyciu Model. Model:
HTML:
W funkcji [HttpPost] możemy pobrać jej właściwości.
źródło
Jeśli naprawdę chcesz używać zwykłego HTML (z jakiegokolwiek powodu), a nie wbudowanych rozszerzeń HtmlHelper, możesz to zrobić w ten sposób.
Zamiast
spróbuj użyć
Pola wyboru w HTML działają tak, że gdy są zaznaczone, wysyłają wartość, a gdy nie są zaznaczone, w ogóle nic nie wysyłają (co spowoduje, że ASP.NET MVC powróci do domyślnej wartości pole,
false
). Ponadto wartość pola wyboru w HTML może być dowolna, a nie tylko prawda / fałsz, więc jeśli naprawdę chcesz, możesz nawet użyć pola wyboru dla pola ciągu w swoim modelu.Jeśli używasz wbudowanego, w
Html.RenderCheckbox
rzeczywistości wyprowadza dwa wejścia: pole wyboru i ukryte pole, dzięki czemu wysyłana jest fałszywa wartość, gdy pole wyboru nie jest zaznaczone (a nie tylko nic). Może to spowodować nieoczekiwane sytuacje, takie jak ta:źródło
Dla wielu pól wyboru o tej samej nazwie ... Kod do usuwania niepotrzebnego fałszu:
Funkcjonować
Użyj tego :
źródło
źródło
Modyfikuj Zapamiętaj w ten sposób
Użyj wartości null bool w kontrolerze i przejdź do wartości false dla wartości null w ten sposób
źródło
W moim przypadku nie ustawiałem właściwości modelu „Remember” w metodzie get. Sprawdź logikę w kontrolerze. Możesz robić to samo. Mam nadzieję, że ta pomoc!
źródło
Przeczytałem inne odpowiedzi i nie do końca udało mi się to zadziałać - więc oto rozwiązanie, które znalazłem.
Mój formularz używa
Html.EditorFor(e => e.Property)
do wygenerowania pola wyboru, a użycieFormCollection
w kontrolerze przekazuje wartość ciągu'true,false'
w kontrolerze.Kiedy obsługuję wyniki, używam pętli do przechodzenia między nimi - używam również
InfoProperty
instancji do reprezentowania bieżącej wartości modelu, która jest oceniana z formularza.Zamiast tego po prostu sprawdzam, czy zwracany ciąg zaczyna się od słowa,
'true'
a następnie ustawiam zmienną boolowską natrue
i przekazuję ją do modelu zwracanego.źródło