Razor 视图的 Duck Typing
Duck Typing for Razor views
我有一个数据会话模型,其中包含许多不同类型的申请人。所有这些都有 FirstName 和 LastName 属性,我想在剃刀视图中显示它们。
var applicant = model.Lead ??
model.Drivers.FirstOrDefault() ??
model.Loans.FirstOrDefault() ??
model.Renewals.FirstOrDefault();
乍一看,我会使用继承,除了这些是 EF 数据库中的 classes,不知道如何设置父 class。
有没有一种干净的方法可以做到这一点,或者我是否遇到了这样的问题?
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 ...
可以使用接口。
假设您的 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>
然后您可以 return 一个填充了不同具体类型的 IEnumerable 集合,并访问在接口上定义的公共属性。
我有一个数据会话模型,其中包含许多不同类型的申请人。所有这些都有 FirstName 和 LastName 属性,我想在剃刀视图中显示它们。
var applicant = model.Lead ??
model.Drivers.FirstOrDefault() ??
model.Loans.FirstOrDefault() ??
model.Renewals.FirstOrDefault();
乍一看,我会使用继承,除了这些是 EF 数据库中的 classes,不知道如何设置父 class。
有没有一种干净的方法可以做到这一点,或者我是否遇到了这样的问题?
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 ...
可以使用接口。
假设您的 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>
然后您可以 return 一个填充了不同具体类型的 IEnumerable 集合,并访问在接口上定义的公共属性。