MVC局部视图中的多态ViewModel集合和渲染

mfl*_*000 7 c# polymorphism asp.net-mvc abstract-class

我的MVC应用程序中的ViewModel的多态集合存在问题.我通过Web服务调用收到了这个,我需要迭代它们并根据对象类型给它们自己的局部视图.

public abstract class ProvinceViewModel
{
    public string Code { get; set; }
}

public sealed class OntarioViewModel : ProvinceViewModel { }

public sealed class QuebecViewModel : ProvinceViewModel {}
Run Code Online (Sandbox Code Playgroud)

在我看来,我试图迭代它们并分配局部视图.我必须在这里进行大量的类型转换才能使其正常工作.如果我尝试将其移动到控制器操作并传入抽象类型,我将得到一个错误,我们无法创建抽象类的实例.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我强烈键入View,以便我可以访问不同的属性.

我将如何以更优雅的方式解决这个问题?我是否需要为抽象类创建一个新的代理基类来创建它的实例更容易?

chr*_*tte 0

我有类似的要求,这就是我设法解决这个问题的方法。我的视图模型 (BusinessEventEmailViewModel ) 有一个在运行时统一解析的接口列表 (IBusinessEventEmail)。IBusinessEventEmail 具有 EventCode 属性。

public class BusinessEventEmailViewModel : MailHeaderViewModel
{
    #region members
    public List<IBusinessEventEmail> Events { get; set; }
Run Code Online (Sandbox Code Playgroud)

在我看来,我使用命名约定来渲染部分视图:

Html.RenderPartial("~/Views/Shared/Email/_" + businessEvent.EventCode + ".cshtml", businessEvent);
Run Code Online (Sandbox Code Playgroud)

然后,我有一个 XXXEventEmail 使用 EventCode XXX 和部分视图 _XXX.cshtml 实现 IBusinessEventEmail