2011-07-08 18 views
11

Załóżmy, że masz listę osób A i listę osób B na stronie. A te dwa są osobnymi klasami w L2S, reprezentującymi dwie różne tabele. Dlatego nie można przekazać jednego modelu w następujący sposób:C# model mvc vs viewbag

... 
@model PeopleA 
... 
@foreach(var peopleA in Model.People) ... 

@foreach(var peopleB in //what?) 

W związku z powyższym, mam trzy opcje do naśladowania.

  • Pierwszym z nich jest podzielenie strony na częściowe widoki, dzięki czemu mogę przekazać model przez pomocnika RenderAction. Ponieważ wykorzystam te widoki częściowe tylko wtedy, gdy opcja ta nie będzie dla mnie atrakcyjna.
  • Druga opcja to użycie ViewBags, którego nie chcę, ponieważ wolę mocno wpisane modele.
  • Ten ostatni, w końcu, co miałem do wykorzystania, ale chciałem zapytać, zanim ten sposób jest stworzenie modelu jak:

ModelMyPage.cs

public List<PeopleA> peopleA { get; set; } 
public List<PeopleB> peopleB { get; set; } 

MyController. cs

... 
ModelMyPage m = new ModelMyPage(); 
m.peopleA = // query 
m.peopleB = // another query 
return(m); 

I masz pomysł. Czy jest to ważny sposób na wykonanie mojego zadania lub czy istnieje lepszy sposób na zrobienie tego, co chcę?

Odpowiedz

17

Tworzenie modelu ViewModel specyficznego dla strony, ponieważ opcja 3 to sposób, w jaki bym to zrobił.

Uważam, że jest to również zalecane podejście.

2

Zrobiłbym to trzeci sposób. Dodatkowo, jeśli idziesz do renderowania HTML identyczny dla każdej osoby w obu tablicach, chciałbym Concat je przed foreach:

var person in Model.PeopleA.Concat(Model.PeopleB) 
2

swój pierwszy i trzeci opcje wydają zarówno OK.

ad 1) "używanie ich tylko raz" nie jest dobrym argumentem przeciwko. Użyj widoków częściowych, aby uporządkować widoki.

ad 2) Użyj Viewbag, aby dodać małe przedmioty, takie jak lista odnośników.

ad 3) ViewModels są (stają się) powszechne w MVC. To chyba najlepsze podejście.

8

Nie, nie ma lepszego pomysłu. W asp.net MVC, M oznacza modele ViewModels, a nie Business, Domain. Zaleca się tworzenie ViewModels dla widoków i nie zaleca się używania modeli biznesowych. Powinieneś zaprojektować swoje ViewModels, aby dopasować się do potrzeb interakcji kontrolera z domeną, a od kontrolera do obejrzenia interakcji

2

Zwykle tworzę model strony i nazwę jako taką, np. AccountDetailsPageModel. W przypadku złożonych stron mogą to być inne modele.