ViewModel 是不是支持嵌套模型?虚拟属性可以应用于 viewModel 吗?
Posted
技术标签:
【中文标题】ViewModel 是不是支持嵌套模型?虚拟属性可以应用于 viewModel 吗?【英文标题】:Does ViewModel supports Nested Models ? Can Virtual property can be applied to viewModel?ViewModel 是否支持嵌套模型?虚拟属性可以应用于 viewModel 吗? 【发布时间】:2016-04-15 16:48:52 【问题描述】:我正在使用 .net 4.5.1,Visual Studio 2013。 我使用 ViewModel -CreateInvoiceViewModel 创建了一个发票创建页面。
public class CreateInvoiceViewModel
public int EntityID get; set;
.
.
public ICollection<InvoicePartialCreateMainBillViewModel> MainBill get; set;
public ICollection<InvoicePartialCreateDetailBillViewModel> DetailBill get; set;
点击“生成发票”后,通过 AJAX,部分视图页面将加载到与 ViewModel 相同的页面中,其中嵌套了另外两个 View Model。 嵌套视图模型在 AJAX 调用函数中给出数据。 部分视图页面 ViewModel - InvoicePartialCreateViewModel
public class InvoicePartialCreateViewModel
public InvoicePartialCreateViewModel()
this.MainBill = new HashSet<InvoicePartialCreateMainBillViewModel>();
this.DetailBill = new HashSet<InvoicePartialCreateDetailBillViewModel>();
public float TotalAmount get; set;
.
.
public ICollection<InvoicePartialCreateMainBillViewModel> MainBill get; set;
public ICollection<InvoicePartialCreateDetailBillViewModel> DetailBill get; set;
internal void CreateMainBill(int count)
for(int i = 0; i < count; i++)
this.MainBill.Add(new InvoicePartialCreateMainBillViewModel());
internal void CreateDetailBill(int count)
for (int i = 0; i < count; i++)
this.DetailBill.Add(new InvoicePartialCreateDetailBillViewModel());
嵌套模型 - InvoicePartialCreateMainBillViewModel、InvoicePartialCreateDetailBillViewModel
public class InvoicePartialCreateMainBillViewModel
public string PackageName get; set;
.
.
public virtual InvoicePartialCreateViewModel InvoiceCreate get; set;
public class InvoicePartialCreateDetailBillViewModel
public DateTime OrderDate get; set;
.
.
public virtual InvoicePartialCreateViewModel InvoiceCreate get; set;
嵌套模型由 html helper @Html.EditorFor 调用
@Html.EditorFor(model => model.MainBill)
@Html.EditorFor(model => model.DetailBill)
局部视图部分呈现。嵌套模型未渲染。 ViewModel 是否支持嵌套模型,是否可以将虚拟属性应用于 viewModel
【问题讨论】:
简短回答 - ViewModels 支持嵌套模型。在 ViewModel 中使用IList
比使用 ICollection
更好。你不应该在 ViewModels 中使用virtual
,因为你没有它的任何优势。在 EF virtual
中允许延迟加载,但 ViewModel 和 EF - 应该是 2 个不同的模型
您在复杂对象的集合上使用EditorFor()
。您是否为InvoicePartialCreateMainBillViewModel
和InvoicePartialCreateDetailBillViewModel
创建了EditorTemplates
?
是的,我已经为视图文件夹中的两个 ViewModel 创建了 EditorTemplates。
【参考方案1】:
Viewmodel 确实支持嵌套模型。
虽然不建议在 ViewModel 中使用 virtual。
公共类 CreateInvoiceViewModel 公共 int EntityID 获取;放;
public IList<InvoicePartialCreateMainBillViewModel> MainBill get; set;
public IList<InvoicePartialCreateDetailBillViewModel> DetailBill get; set;
虚拟通常与域对象一起使用,最终用于填充或映射视图模型。
不过,这可能完全取决于您的情况。
例如,您有一个具有属性 A 的基类,以及一个派生类 1 和派生类 2。两者都需要属性 A,但它们有自己的实现。然后,您可以将属性 A 保持为虚拟,并根据要求在任一派生类中覆盖。
例如:
public class BaseViewModel
[Required]
public virtual int propA get; set;
public class DerivedViewModel1
......
public class DerivedViewMode2
public override int propA get; set;
在这种情况下你可以使用虚拟,否则不推荐。
【讨论】:
以上是关于ViewModel 是不是支持嵌套模型?虚拟属性可以应用于 viewModel 吗?的主要内容,如果未能解决你的问题,请参考以下文章