2010-12-15 17 views
11

Byłem przyzwyczajony do dekorowania klas modeli danych za pomocą atrybutów adnotacji danych, ale purysta we mnie nieznacznie opiera się na włączaniu czysto prezentacyjnych atrybutów, takich jak format wyświetlania tutaj. Cieszę się jednak, że mogę tutaj zachować atrybuty związane z walidacją. Jednym z ważnych powodów, dla których muszę nadal przechowywać wszystkie adnotacje itp. W modelu danych, jest to, że mój model widoku agreguje klasy modeli danych, np. moja właściwość ViewModelBase.DetailItem<TEntity> w modelu widoku jest po prostu odwołaniem do klasy encji w moim modelu danych. Gdybym chciał przenieść adnotacje prezentacyjne do modelu widoku, musiałbym całkiem radykalnie zmienić mój projekt na taki, w którym duplikuję właściwości modelu danych w moim modelu widoku i użyć narzędzia mapowania obiektów do wypełnienia obiektów modelu widoku na podstawie obiektów modelu danych.Czy adnotacje danych powinny należeć do modelu lub modelu widoku?

Gdzie powinienem robić moje adnotacje danych?

Tak BTW, to jest to, co mój brulion ViewModelBase wygląda następująco:

public class ViewModelBase<T> 
{ 
    public virtual string PageTitle { get; set; } 
    public virtual string ViewHeading { get; set; } 

    public virtual ViewMode ViewMode { get; set; } 
    public virtual IEnumerable<T> ItemList { get; set; } 
    public virtual T DetailItem { get; set; } 
} 
+0

Sprawdź również: http://stackoverflow.com/questions/3338919/mvc-validation-using-data-annotations-model-classes-or-view-model-classes – DarrellNorton

Odpowiedz

7

Podzielam ten sam problem wokół dyrektora DRY i walidacji, dlatego wolę zachować większość wymagań walidacyjnych w modelu. Ale dlaczego musi to być jedna lub druga? Walidacja modelu należy do modelu, ale istnieją pewne weryfikacje specyficzne dla widoku, które należą do modelu widoku.

W związku z tym adnotacje danych to tylko: adnotacje wokół danych. Niepoprawna logika walidacji. Logika walidacji jest zupełnie inną koncepcją niż adnotacje danych (Wymagany atrybut to tylko jeden aspekt sprawdzania poprawności). Osobiście uważam, że trudno jest ustalić, gdzie prawdziwa weryfikacja pasuje do implementacji MVVM, ponieważ niektóre walidacje wymagają kontekstu, a nie tylko wymaganego lub nie.

Krótka odpowiedź: jeśli jest w Twoim modelu, zostaje połączona z Twoimi modelami. Jeśli istnieje specjalne zapotrzebowanie na widok, w razie potrzeby model podglądu może spełnić dodatkowe wymagania.

+0

Hej @ William, dawno nie czytałem :-) Podoba mi się to, co mówisz o walidacji, która jest agregowana z viewmodels, ale mam pewne przeszkody w dodawaniu dodatkowej weryfikacji do agregacji typów modeli. Zobaczę, czy dziś wieczorem pojawi się coś zabawnego. – ProfK

+0

Być może viewmodels nie są odrysowywane wystarczająco daleko od modeli (lub odwrotnie, nie są one wyabstrahowane wystarczająco blisko poglądów), aby decyzja była łatwa? Nadal uważam, że walidacja nie dotyczy widoków. Może to być związane z kontekstem (np. W systemie szpitalnym wymagana jest nazwa, z wyjątkiem noworodków, w przypadku których nie można jeszcze stosować nazwy), ale logika walidacji i wnioskowania rzadko ma zastosowanie tylko do określonego widoku. – WilliamB

+0

Zastanawiam się, kto głosował na ciebie tutaj. Naprawdę nie jestem wezwany, jeśli mnie pytasz. – ProfK

11

walidacji powinny być wykonywane przynajmniej w modelu widoku, bo to jest to, co otrzymujesz od widoku. Również walidacja jest zawsze wykonywana w kontekście danego widoku. Tak więc można mieć dwa różne modele widoku odpowiadające dwóm różnym widokom, ale odwzorowane na pojedynczą klasę modelu, a ponieważ sprawdzanie poprawności może być różne w zależności od widoku, to sprawdzanie poprawności powinno być wykonywane na modelu widoku. Jeśli wykonano sprawdzanie poprawności w modelu, trudno byłoby rozróżnić te dwa przypadki, ponieważ można mieć sytuację, w której właściwość jest wymagana w pierwszym widoku, ale nie jest wymagana w drugim widoku. Jeśli więc do sprawdzania poprawności używasz adnotacji do danych, powinieneś udekorować swój model widoku.

+0

dobry punkt na temat dwóch różnych walidacji, ale Wydaje się, że model bardziej uwzględnia DTO niż pełny model domeny z logiką biznesową, aby uwzględnić różne przypadki użycia, gdzie każdy przypadek użycia będzie pokryty przez inny model widoku i widoku. – ProfK

Powiązane problemy