Mam problem z polimorficzną kolekcją ViewModels w mojej aplikacji MVC. Otrzymałem to poprzez wywołanie usługi internetowej i muszę iterować przez nie i dać im własny widok częściowy, w oparciu o typ obiektu.Polimorficzne ViewModel kolekcja i rendering w częściowych widokach MVC
public abstract class ProvinceViewModel
{
public string Code { get; set; }
}
public sealed class OntarioViewModel : ProvinceViewModel { }
public sealed class QuebecViewModel : ProvinceViewModel {}
Moim zdaniem próbuję iterować i przypisywać częściowy widok. Muszę wykonać wiele rzutowania typu, aby to działało. Jeśli spróbuję przenieść to do akcji kontrolera i przekazać typ abstrakcyjny, otrzymam błąd, że nie możemy utworzyć instancji klasy abstrakcyjnej.
ICollection<ProvinceViewModel> ProvinceList; // collection receive via service
@for (int i = 0, c = ProvinceList.Count; i < c; i++)
{
var currentProvince = this.Model.ElementAt(i);
@switch (additionalRegistry.Code)
{
case "QC":
@Html.Partial("AlbertaDetail", (QuebecViewModel)currentProvince)
break;
case "ON":
@Html.Partial("OntarioDetail", (OntarioViewModel)currentProvince)
break;
default:
@Html.Partial("ProvinceDetail", ProvinceViewModel)
break;
}
}
Mam zdecydowanie typu Widok, aby uzyskać dostęp do różnych właściwości.
Jak mógłbym rozwiązać ten problem w bardziej elegancki sposób? Czy muszę utworzyć nową zastępczą klasę podstawową dla klasy abstrakcyjnej, aby łatwiej utworzyć taką instancję?
można mieć 'stronę ProvinceDetail' zrobienia zamiast tego zamiast tego traktować różne prowincje?To pozwoliłoby ci zachować logikę na tej stronie, zamiast powtarzać ją, jeśli używasz ich gdzie indziej. – DLeh
To nie jest jasne: czy musisz utworzyć instancję częściowego widoku dla każdego * konkretnego typu * Prowincji regionalnej lub każdego * tworzenia instancji * ? Wydaje się dziwne, że na przykład masz kilka częściowych widoków QuebecDetail. – Kjata30
Przepraszamy, próbowałem uprościć przykład. Potrzebuję utworzyć wystąpienie częściowego widoku dla każdej prowincji, która ma różne właściwości. na przykład Ontario, Quebec, Manitoba, BC wszystkie mają określony i inny częściowy widok, wszystko inne dostaje standardowy domyślny widok ogólny, tj. ProvinceDetail. Rezultatem będzie lista prowincji i ich szczegóły na stronie głównej. – mflair2000