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,以便我可以访问不同的属性.
我将如何以更优雅的方式解决这个问题?我是否需要为抽象类创建一个新的代理基类来创建它的实例更容易?
我有类似的要求,这就是我设法解决这个问题的方法。我的视图模型 (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
归档时间: |
|
查看次数: |
741 次 |
最近记录: |