2012-03-01 17 views
6

Zbyt często natrafiłem na sytuację, w której widok w moim projekcie powoduje zgłoszenie odwołania o wartości zerowej .Widoki MVC3: Obsługa modeli zerowych z finezją

@model Johnny.Application.TestModel 
<div>@(Model.SomeText)</div> 

to zgłasza błąd jeśli model jest zerowy.

Ale jak radzą sobie z tym ludzie? Na pewno nie widzę wszędzie przykładów kodu z brzydkimi zerami sprawdzającymi zaśmiecanie kodu w widoku. To prowadzi mnie do przekonania, że ​​przez większość czasu kontrolerzy nie powinni zwracać modeli zerowych. Ale jak możesz wymusić to z większą finezją?

Teraz, gdy ktoś przypadkowo spowoduje, że kontroler zwróci model zerowy, model widoku wysadza się i wygląda na wadliwy. W rzeczywistości była to wina kontrolera. A widok może nawet nie "złapać" problemu, zrobi to tylko wtedy, gdy członkowie modelu zdążą się przyzwyczaić (co jest oczywiście w większości przypadków).

Z różnych powodów niektóre widoki mogą obsługiwać wartości puste. Nie spodziewałbym się, że będzie to jednak przypadek większości. Najwyraźniej chodzi o ustalenie jakiejś "umowy" między widokiem a kontrolerem.

Nie lubię opcje Widziałem:

  1. Sprawdź, czy model jest zerowa za każdym razem jest on wykorzystywany. Bardzo lame!
  2. Jedno z nich: duże, jeśli instrukcja zawija cały widok za pomocą zerowego modelu sprawdzania. Pomyśl o zmarnowanym kodzie nieruchomości. Kulawy!
  3. Dodaj numer , jeśli sprawdzisz rzutem u góry. Nieźle, ale wydaje się głupie. Lekko kulawy.

chciałbym wiedzieć, czy coś takiego istniało tych opcji, aby ustawić „null” nie zamówienia:

  • atrybut na metodzie kontrolera jak [NoNullModels]. Wątpię, aby tak się stało, ponieważ nie sądzę, aby kontroler wiedział, do czego jest podłączony.
  • W widoku, wskaźnik jak @ MVC3.HeyDontAllowNulls lub inny standardowy sposób rzuca wyjątek (jak opcja 3 powyżej)
+0

po co zwracać model zerowy? –

+1

wypróbowałeś '@ Html.DisplayFor (m => m.SomeText)' –

+0

Na przykładowym przykładzie kodu 99% próbek kodu w Internecie jest pozbawionych obsługi wyjątków i sprawdzania poprawności danych wejściowych. Częściowo z lenistwa, a częściowo dlatego, że pomyliłoby to punkt, który ilustruje przykładowy kod. –

Odpowiedz

2

zadałem podobne pytanie tutaj Should one try to guard against null reference exceptions/index out of bounds exceptions in MVC views? i dostał dobre odpowiedzi do niego. W skrócie, preferowane jest dodawanie kontroli null w kontrolerach, a nawet w jednostkowych testach zamiast w widokach.

+0

Nie myślałem o podejściu do testowania jednostkowego i jest to dobry scenariusz dla ich użyteczności. Ponieważ nie "posiadam" całego kodu, nie będę w stanie sprawić, by wszystkie jednostki kontrolerów były testowalne, więc mam nadzieję znaleźć opcję zastępczą dla widoku w tych przypadkach. –

+0

Przyznaję również, że gdybym miał, powiedzmy, bardzo wspólny pogląd, który zostałby wyedukowany z wielu metod działania, na pewno miałbym ochotę dodać kontrolę zerową w jednym miejscu, w samym widoku, a nie w kilkunastu innych miejscach nawet jeśli posiadałem cały kod. Być może będziesz w stanie nazwać to przestrzeganiem zasady DRY, kosztem nieco naruszenia Separacji Obawy MVC. –

+0

Im więcej o tym myślę, tym bardziej uważam, że widok jest właściwym miejscem do dodania czegoś. Jednym z powodów jest to, że pojedyncze działanie kontrolera może prowadzić do kilku różnych widoków. Naprawianie go po stronie sterownika nie jest skuteczne, ponieważ wcześniej czy później wyskoczy przeciek (jak sytuacja, w której się znajduję!) –

0

Istnieje wiele preferencje tutaj, niektórzy, że można zrobić to:

  1. Rzut RecordNotFoundException w warstwie danych (niestandardowych wyjątku) i mają globalny połowów przy filtra wyjątek ten
  2. Sprawdzić null wracających z repozytorium i uchwyt w scenariuszu indywidualnego przypadku:
  3. Udekoruj swoje kontrolery, aby szukały modelu zerowego w metodach GET, które nie są metodami CREATE (lub regułami, które uznasz za w porządku) za pomocą atrybutu filtru akcji, aby sprawdzić to w programie OnActionExecuted

Nawet moje widoki "CREATE" na ogół otrzymują model, nawet jeśli są puste (choć często mają w nich IEnumerable <SelectListItem>), więc powinny zawsze mieć model idący do nich.

0

Sprawdzam wartości null w moich widokach, czasami w częściach, które tego wymagają.

Będę też czasami tworzył wartości domyślne w moim kontrolerze, jeśli ma być wartość pusta, zależy od tego, co próbujesz zrobić i co jest do przyjęcia.

Mam na przykład przypadek, w którym ludzie subskrybują coś i ustawiają powiadomienia. Jeśli nie mają powiadomień, sub-obiekt mojego modelu ma wartość zerową. Nie chcę ustawiać wartości domyślnych, więc mam tam czek. W innych sekcjach po prostu używam wartości domyślnej.

Powiązane problemy