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()。您是否为InvoicePartialCreateMainBillViewModelInvoicePartialCreateDetailBillViewModel 创建了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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 嵌套模型和虚拟属性初始化

Mvc 列出嵌套在 Viewmodel 中的多个视图

在保存之前验证多个嵌套属性关联模型是不是相等

查看多个模型(不是表单)时的嵌套属性

java.util.Properties 是不是支持嵌套属性?

父属性更改时嵌套属性的 WPF 绑定更新通知