Mój model ma wartość logiczną, która musi mieć wartość zerową
public bool? Foo
{
get;
set;
}
więc w moim cshtml Razor mam
@Html.CheckBoxFor(m => m.Foo)
ale to nie działa. Ani też rzucanie za pomocą (bool). Jeśli zrobię
@Html.CheckBoxFor(m => m.Foo.Value)
to nie tworzy błędu, ale nie wiąże się z moim modelem po wysłaniu, a foo ma wartość null. Jaki jest najlepszy sposób na wyświetlenie Foo na stronie i powiązanie go z moim modelem w poście?
asp.net-mvc-3
razor
nullable
DMulligan
źródło
źródło
Odpowiedzi:
Mam to do pracy
a następnie tworzenie Boolean.cshtml w moim folderze EditorTemplates i przyklejanie
wewnątrz.
źródło
HasValue
właściwości dopuszczającej wartość null , ale nie dla rzeczywistej wartości logicznej. Spowoduje to utworzenie zaznaczonego pola wyboru, jeśli niezależnie od wartości bazowej. Jeśli dopuszczalna wartość null ma wartość, zawsze będzie to prawda.Znalazłem odpowiedź na podobne pytanie - Rendering Nullable Bool as CheckBox . Jest to bardzo proste i po prostu działa:
To jak zaakceptowana odpowiedź od @afinkelstein, z wyjątkiem tego, że nie potrzebujemy specjalnego „szablonu edytora”
źródło
Mam
bool? IsDisabled { get; set; }
w Modelu. Wstawione, jeśli w widoku.źródło
Czemu? To nie ma sensu. Pole wyboru ma dwa stany: zaznaczone / niezaznaczone lub Prawda / Fałsz, jeśli chcesz. Nie ma trzeciego państwa.
A może poczekaj, gdy używasz modeli domeny w widokach zamiast modeli widoku? To Twój problem. Więc rozwiązaniem dla mnie jest użycie modelu widoku, w którym zdefiniujesz prostą właściwość boolowską:
a teraz akcja kontrolera przekaże ten model widoku do widoku i wygeneruje odpowiednie pole wyboru.
źródło
Komplikowanie prymitywu ukrytymi polami w celu wyjaśnienia, czy Fałsz czy Null nie jest zalecane.
Pole wyboru nie jest tym, czego powinieneś używać - tak naprawdę ma tylko jeden stan: zaznaczone . W przeciwnym razie może to być wszystko.
Gdy twoje pole bazy danych ma wartość logiczną (
bool?
) dopuszczającą wartość null , interfejs użytkownika powinien używać przycisków 3-radiowych, gdzie pierwszy przycisk reprezentuje „zaznaczone”, drugi przycisk reprezentuje „nie zaznaczono”, a trzeci przycisk reprezentuje wartość null, niezależnie od semantyki null oznacza. Możesz użyć<select><option>
listy rozwijanej, aby zapisać nieruchomość, ale użytkownik musi kliknąć dwa razy, a wybory nie są tak natychmiastowo jasne.RadioButtonList, zdefiniowane jako rozszerzenie o nazwie RadioButtonForSelectList, buduje przyciski opcji, w tym wybraną / zaznaczoną wartość, i ustawia
<div class="RBxxxx">
tak, aby można było użyć css, aby ustawić przyciski radiowe w poziomie (display: inline-block), w pionie lub w formie tabeli (display: inline-block; width: 100px;)W modelu (używam string, string dla definicji słownika jako przykładu pedagogicznego. Możesz użyć bool ?, string)
źródło
Dla mnie rozwiązaniem była zmiana modelu widoku. Zastanów się, czy szukasz faktur. Te faktury mogą być opłacone lub nie. Twoje wyszukiwanie ma więc trzy opcje: płatne, bezpłatne lub „nie obchodzi mnie to”.
Miałem to pierwotnie ustawione jako bool? pole:
To sprawiło, że natknąłem się na to pytanie. Skończyło się na utworzeniu typu Enum i załatwiłem to w następujący sposób:
Oczywiście miałem je zawinięte w etykiety i określony tekst, mam na myśli tylko inną opcję do rozważenia.
źródło
Pole wyboru oferuje tylko 2 wartości (prawda, fałsz). Wartość logiczna dopuszczająca wartość null ma 3 wartości (prawda, fałsz, null), więc nie można tego zrobić za pomocą pola wyboru.
Dobrym rozwiązaniem jest skorzystanie z listy rozwijanej.
Model
Kontroler
Widok
źródło
Właściwie stworzyłbym dla niego szablon i użyłbym tego szablonu z EditorFor ().
Oto jak to zrobiłem:
Utwórz mój szablon, który jest w zasadzie częściowym widokiem, który utworzyłem w katalogu EditorTemplates, w obszarze Udostępnione, w obszarze Widoki nazwij go jako (na przykład)
CheckboxTemplate
:Użyj tego w ten sposób (w dowolnym widoku):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
To wszystko.
Szablony są tak potężne w MVC, używaj ich .. Możesz stworzyć całą stronę jako szablon, którego użyjesz z
@Html.EditorFor()
; pod warunkiem, że przekażesz jego model widoku w wyrażeniu lambda.źródło
Najczystszym podejściem, jakie mogłem wymyślić, jest rozszerzenie dostępnych rozszerzeń,
HtmlHelper
przy jednoczesnym ponownym wykorzystaniu funkcji zapewnianych przez framework.Eksperymentowałem z „kształtowaniem” wyrażenia, aby umożliwić proste przejście do tubylca,
CheckBoxFor<Expression<Func<T, bool>>>
ale nie sądzę, żeby było to możliwe.źródło
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
i zadziałało cudownie.W przeszłości miałem podobny problem.
Utwórz pole wyboru w HTML i ustaw atrybut name = "Foo". Powinno to nadal być wysyłane poprawnie.
źródło
Po prostu sprawdź wartość null i zwróć do niej false:
źródło
Ja też stanąłem przed tym samym problemem. Wypróbowałem następujące podejście, aby rozwiązać problem, ponieważ nie chcę zmieniać bazy danych i ponownie generować EDMX.
źródło
Podczas tworzenia EditorTemplate dla modelu, który zawiera wartość bool dopuszczającą wartość null ...
Podziel wartość zerową bool na 2 wartości logiczne:
W szablonie edytora:
Nie ogłaszaj zwrotnie oryginalnej właściwości Foo, ponieważ jest ona teraz obliczana na podstawie FooIsNull i FooCheckbox.
źródło
Wszystkie powyższe odpowiedzi miały swoje własne problemy. Najłatwiejszym / najczystszym sposobem IMO jest stworzenie pomocnika
Brzytwa MVC5
App_Code / Helpers.cshtml
Stosowanie
W moim scenariuszu pole wyboru dopuszczające wartość zerową oznacza, że członek personelu nie zadał jeszcze pytania klientowi, więc jest opakowany
.checkbox-nullable
tak, aby można było odpowiednio stylizować i pomóc użytkownikowi końcowemu zidentyfikować, że nie jest totrue
anifalse
CSS
źródło
Metody rozszerzeń:
źródło
Przyciski opcji są przydatne, ale nie pozwalają na odznaczenie . Jeśli chcesz tego zachowania, rozważ użycie listy rozwijanej / wybierz. Poniższy kod wygeneruje
SelectList
i powiąże się pomyślnie z wartością logiczną dopuszczającą wartość null:źródło
źródło
możesz spróbować w ten sposób
źródło
To stare pytanie, a istniejące odpowiedzi opisują większość alternatyw. Ale jest jedna prosta opcja, jeśli masz bool? w Twoim modelu widoku i nie przejmujesz się null w swoim interfejsie użytkownika:
źródło