Pytanie Najlepsze praktyki dla MVC .. ViewModel Binding przy użyciu interfejsów Przykład


Jestem nowy w ASP.NET MVC 3.0 i próbuję zbudować aplikację przy użyciu projektu MVC ViewModel.

Zastanawiam się, jakie najlepsze praktyki zmieniają kontrolery dla ViewModels i mam kilka pytań poniżej. To moje dotychczasowe zrozumienie (które może być błędne).

  • Tworzymy modele.
  • Utwórz ViewModels, tworząc nową klasę i zadeklaruj atrybuty o tej samej nazwie i typie, co klasy modelu podstawowego (w tym pola ID modeli podstawowych, które chcesz później zaktualizować), a klasy nie są w żaden sposób powiązane).
  • Utwórz repozytorium dla każdego z modeli podstawowych (aby znaleźć i zapisać dane itd.).
  • Utwórz działanie kontrolera dla każdego z modeli ViewModels (które uzyskują dostęp do repozytoriów klas podstawowych w celu pobrania wartości i umieszczenia tych wartości w ViewModelu, a następnie przekazania ViewModel do widoku ViewModels).
  • Twórz widoki z ViewModels (ViewModel Views)
  • W metodzie Update (POST) kontrolera ViewModel otrzymaj zaktualizowany obiekt ViewModel i przekonwertuj go na obiekty modelu podstawowego (może użyć Automapper?), A następnie zapisz obiekty modelu podstawowego za pomocą swoich repozytoriów i zastosuj powiązanie w ten sposób? "TryUpdate <'IPerson> (osoba)", "TryUpdate <' IPlace> (miejsce);" (wygląda na to, że celem jest przeniesienie wartości z powrotem do klas bazowych z ViewModel, zastosowanie powiązania, zapisanie modeli bazowych z powrotem przy użyciu repozytoriów! ... To nie wydaje się korzystać z repozytoriów. Zamiast z TryUpdate <'IPerson> (osoba), Spodziewam się zobaczyć coś takiego: person.Save (IPerson) .. gdzie "osoba zawiera wartości", ".Save jest repozytorium", a "IPerson zawiera wiążące atrybuty do wykorzystania do wiązania"? .. Nie jestem pewien, czy to prawda ..

Do tej pory stworzyłem ViewModels, tworząc nową klasę i dodając atrybuty z różnych modeli bazowych, używając tych samych nazw. W tym momencie mam następujące pytania:

P1: Czy każdy ViewModel ma swój własny kontroler i ma dostęp do każdej z klas repozytoriów modeli bazowych, aby uzyskać jego wartości?

Q2: w ViewModel należy dołączyć pole ID wszystkich modeli bazowych, z których korzystasz z atrybutów, biorąc pod uwagę, że możesz chcieć POST Update za pośrednictwem kontrolera ViewModels do repozytorium modeli bazowych (wymagające wartości ID)?

P3: W jaki sposób można wiązać atrybuty za pomocą interfejsu do wiązania modelu w kontrolerze przy użyciu repozytorium do zapisania.

Nie udało mi się znaleźć samouczka lub zasobu, który wyjaśnia wszystko w przykładach krok po kroku. Pełna odpowiedź byłaby następującym przykładem:

  • 2x proste modele, 1x prosty viewModel, 1x interfejs do bindowania, 1x prosty kontroler używający klasy interfejsu do wiązania przy aktualizacji, 1x repozytorium .. tj.

// Model1

public class Person
{
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}
  DateTime DOB {get;set}
}

// Model2

public class Place
{
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}
  string PostCode {get;set;}
}

// ViewModel (zawierający atrybuty z modeli)

publc class ViewModel
{
  //Person attributes
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}

  //Place attributes
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}

  //other attributes
  string someOtherAttributeForDisplay {get;set}
}

// Interfejs Model1 (do wiązania w modelu)

public interface IPerson
{
  string FirstName {get;set;}
}

// Interfejs Model2 (do wiązania w modelu)

public interface IPlace
{
  string Description {get;set;}
  string AreaType {get;set}
}

// ViewModelController?

{
  //What goes here?
}

//Magazyn?

{
  //what goes here?
}

12
2017-10-27 10:19


pochodzenie


czy używasz Nuget? - Mitch Wheat
Cześć Mitch, szukałem w użyciu NuGet, aby dodać Unity i EntLib do moich projektów, nie jestem całkiem pewien ich celów, ale .. - HonourCode


Odpowiedzi:


Myślę, że możesz przesadzić z bardzo prostą koncepcją.

Po pierwsze niektóre ogólne zasady:

  • Nie używaj TryUpdateModel. Po prostu nie rób tego.
  • Z tych samych powodów nie używaj żadnych "automatycznych" mapujących maperów do mapowania od twój model widoku do twoich bytów. Automatyczne odwzorowywanie odwrotnie (z obiektu do modelu widoku) jest w porządku.

Używanie interfejsów jest niepotrzebne.

Modele widoku mają być bardzo prostymi klasami, które zawierają tylko te informacje, które są potrzebne do wyświetlenia. Jeśli twój widok POSTs różni się od tego, co wyświetla, po prostu utwórz inny model widoku dla POST.

Używamy konwencji nazewniczej {Kontroler} {Działanie} Model dla naszych modeli widoków. Tak więc dla akcji o nazwie "Lista" na kontrolerze "Post" otrzymamy model o nazwie "PostListModel".

Na koniec sprawdź moją odpowiedź tutaj Prawdziwy przykład TryUpdateModel, ASP .NET MVC 3


6
2017-10-27 10:30



Dziękuję za odpowiedź. Czy wiesz, że możesz wiązać wartości w metodzie TryUpdate, włączając interfejs i model? tj. TryUpdate <'IPerson> (osoba) Znalazłem tu informacje, które śledziłem, ale zmieniono nieznacznie w mojej wersji, aby umożliwić wyświetlanie właściwości w widoku i wiązać się później w kontrolerze (to jest koncepcja): codetunnel.com/blog/post/79/aspnet-mvc-model-binding-security.. myślisz, że ten facet jest na coś lub z jego rocker? :) - HonourCode
Wydaje mi się, że używanie interfejsów w ten sposób ma jedynie na celu wyeliminowanie niedociągnięć związanych z używaniem TryUpdateModel (w celu ograniczenia aktualizowanych właściwości), co można osiągnąć za pomocą prostego odwzorowania lewej i prawej strony. - Ben Foster
Zaletą jest to, że można użyć automappera do odwzorowania właściwości, aby można było zredukować kod, nie wymagając mapowania lewy-prawy, zamiast tego można po prostu przepuścić obiekty. A jeśli Fiddler zmienia atrybuty, to nie ma to znaczenia, ponieważ wiązanie nie zezwalam na zapisywanie wartości w TryUpdate <'IModel> (model) w ten sam sposób, w jaki działa odwzorowanie lewy-prawy. Zastanawiam się, który kontroler będzie potrzebował ViewModel? .. Jest własny lub użyłby kontrolerów klasy bazowej ? : S .. - HonourCode
Nie widzę, że zapisujesz jakiś kod, ponieważ będziesz musiał napisać interfejs dla każdego modelu widoku. Viewmodel nie ma żadnego odniesienia do kontrolera. Powinieneś mieć viewmodel dla każdej metody działania w twoim kontrolerze (jak w moim przykładzie). - Ben Foster
Widzę twoją wskazówkę! .. :) lol .. Jedyną zaletą jest to, że redukuje to kod w kontrolerze, ale muszę się zastanowić, czy warto to zrobić: S .. Który kontroler poleciłbyś dla mojego przykładu ViewModel, który używa wartości z modelu Person i Umieść model oraz inne atrybuty .. tj. PersonController lub PlaceController, aby umieścić ActionMethod. - HonourCode