鸭子为Razor视图打字

时间:2015-07-23 15:04:25

标签: c# asp.net-mvc asp.net-mvc-3 razor duck-typing

我有一个数据会话模型,其中包含许多不同类型的申请人。所有这些都有FirstName和LastName属性,我想在剃刀视图中显示。

var applicant = model.Lead ??
                model.Drivers.FirstOrDefault() ??
                model.Loans.FirstOrDefault() ?? 
                model.Renewals.FirstOrDefault();

乍一看,我会使用继承,除了这些是EF数据库中的类,不知道如何设置父类。

有没有干净的方法可以做到这一点,还是我坚持这样的事情?

dynamic applicant = new ExpandoObject();

if (model.Lead != null) {
   applicant.FirstName = model.Lead.FirstName;
   applicant.LastName = model.Lead.LastName;
} else if ( model.Drivers.Any() ) {
   var first = model.Drivers.FirstOrDefault();
   applicant.FirstName = first.FirstName;
   applicant.LastName = first.LastName;
} else if ...

1 个答案:

答案 0 :(得分:2)

您可以使用界面。

假设您生成的EF代码模型如下所示:

public partial class Driver {
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // other properties ...
}

public partial class Loan {
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // other properties ...
}

public partial class Renewal {
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // other properties ...
}

public partial class Lead {
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // other properties ...
}

然后创建一个定义公共属性的接口:

public interface IApplication {
    string FirstName { get; set; }
    string LastName { get; set; }
}

然后实现该接口:

public partial class Driver : IApplication {}

public partial class Loan : IApplication {}

public partial class Renewal : IApplication {}

public partial class Lead : IApplication {}

然后将视图中的模型设置为:

@model IEnumerable<IApplication>

然后您可以返回填充了不同混凝土类型的IEnumerable集合,并访问界面上定义的公共属性。