У меня возникла проблема с полиморфной коллекцией ViewModels в моем приложении MVC. Я получил это через вызов веб-службы, и мне нужно пройти через них и дать им свой собственный частичный вид, основанный на типе объекта.Полиморфная коллекция и рендеринг ViewModel в MVC partial Views
public abstract class ProvinceViewModel
{
public string Code { get; set; }
}
public sealed class OntarioViewModel : ProvinceViewModel { }
public sealed class QuebecViewModel : ProvinceViewModel {}
На мой взгляд, я пытаюсь выполнить итерацию через них и назначить частичный вид. Мне нужно сделать много типов, чтобы заставить его работать. Если я попытаюсь переместить это в действие контроллера и передать абстрактный тип, я получу ошибку, чтобы мы не могли создать экземпляр абстрактного класса.
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;
}
}
У меня есть сильный тип View, так что я могу получить доступ к различным свойствам.
Как я могу решить это более элегантным способом? Нужно ли мне создать новый суррогатный базовый класс для абстрактного класса, чтобы создать экземпляр этого элемента проще?
вы могли бы иметь 'ProvinceDetail' страница вместо этого вместо этого нужно переходить на разные провинции?Это позволит вам сохранить логику на этой странице, вместо того, чтобы повторять ее, если вы используете их в другом месте. – DLeh
Это неясно: вам нужно создать экземпляр частичного вида для каждого * конкретного типа * RegionDetail или каждого * экземпляра * ? Кажется странным, что у вас будет несколько частичных представлений QuebecDetail, например. – Kjata30
Извините, я попытался упростить пример. Мне нужно создать частичное представление для каждой провинции, которая имеет несколько разных свойств. например, Онтарио, Квебек, Манитоба, Британская Колумбия, все имеют конкретное и различное частичное представление, все остальное получает стандартный общий общий вид, т.е. ProvinceDetail. Результатом будет список провинций и их детали на главной странице. – mflair2000