Właśnie zauważyłem, że Html.CheckBox("foo")
generuje 2 wejścia zamiast jednego, ktoś wie dlaczego tak jest?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
asp.net-mvc
Omu
źródło
źródło
Odpowiedzi:
Jeśli pole wyboru nie jest zaznaczone, pole formularza nie jest przesyłane. Dlatego w ukrytym polu zawsze występuje fałszywa wartość. Jeśli pozostawisz pole wyboru niezaznaczone, formularz nadal będzie miał wartość z ukrytego pola. W ten sposób ASP.NET MVC obsługuje wartości pól wyboru.
Jeśli chcesz to potwierdzić, zaznacz pole wyboru w formularzu nie za pomocą Html.Hidden, ale za pomocą
<input type="checkbox" name="MyTestCheckboxValue"></input>
. Pozostaw niezaznaczone pole wyboru, prześlij formularz i sprawdź wartości żądań po stronie serwera. Zobaczysz, że nie ma wartości pola wyboru. Gdybyś miał ukryte pole, zawierałoby onoMyTestCheckboxValue
wpis zfalse
wartością.źródło
IsActive
, która jest inicjowanatrue
w konstruktorze. Użytkownik usuwa zaznaczenie pola wyboru, ale ponieważ wartość nie jest wysyłana do serwera, model spoiwa nie odbiera jej, a wartość właściwości nie jest zmieniana. Model segregatorowy nie powinien zakładać, że jeśli wartość nie zostanie wysłana, zostanie ustawiona wartość false, ponieważ może to być Twoja decyzja o nieprzesyłaniu tej wartości.false
wartość, nawet jeśli są zaznaczone, i to jest mylące. Wyłączone pola wyboru nie powinny w ogóle wysyłać żadnej wartości, jeśli ASP.NET chce być zgodny z domyślnym zachowaniem HTTP.Możesz napisać pomocnika, aby zapobiec dodawaniu ukrytych danych wejściowych:
Użyj tego:
źródło
@using Your.Name.Space
na górze pliku .cshtml razor.System.Web.Mvc.Html
aby był dostępny we wszystkich widokachpo zaznaczeniu i przesłaniu pola wyboru wykonaj to
Odnosić się
źródło
Podejście ręczne jest następujące:
źródło
To mocno typowana wersja rozwiązania Aleksandra Trofimowa:
źródło
Użyj Zawiera, będzie działać z dwiema możliwymi wartościami post: „false” lub „true, false”.
źródło
Ukryte dane wejściowe powodowały problemy ze stylowymi polami wyboru. Więc stworzyłem rozszerzenie pomocnika HTML, aby umieścić ukryte dane wejściowe poza div zawierającym CheckBox.
Wynik
źródło
To nie jest błąd! Dodaje możliwość posiadania zawsze wartości, po wysłaniu formularza na serwer. Jeśli chcesz poradzić sobie z polami wejściowymi pola wyboru za pomocą jQuery, użyj metody prop (przekaż właściwość „zaznaczone” jako parametr). Przykład:
$('#id').prop('checked')
źródło
Możesz spróbować zainicjować konstruktor swojego modelu w następujący sposób:
i twoim zdaniem:
źródło
Odkryłem, że to naprawdę spowodowało problemy, gdy miałem WebGrid. Łącza sortujące w sieci Web zamieniłyby się przez podwojone kwerendy lub x = true i x = false na x = true, false i spowodowałyby błąd analizy w polu wyboru dla.
Skończyło się na użyciu jQuery do usunięcia ukrytych pól po stronie klienta:
źródło