Поддерживает ли ViewModel вложенные модели? Можно ли применить виртуальное свойство к viewModel?

Я использую .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, которая вложена еще в две модели просмотра. Вложенные модели представления получают данные в вызываемой функции 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 @Html.EditorFor.

@Html.EditorFor(model => model.MainBill)
@Html.EditorFor(model => model.DetailBill)

Частичный вид визуализируется частично. Вложенные модели не отображаются. Поддерживает ли ViewModel вложенные модели и можно ли применить виртуальное свойство к viewModel?


person anand    schedule 11.01.2016    source источник
comment
короткий ответ - ViewModels поддерживают вложенные модели. Лучше использовать IList, а не ICollection во ViewModels. Вы не должны использовать virtual в ViewModels, потому что у вас нет никаких преимуществ. В EF virtual разрешена ленивая загрузка, но ViewModel и EF — должны быть 2 разные модели   -  person teo van kot    schedule 11.01.2016
comment
Вы используете EditorFor() для коллекций сложных объектов. Вы создали EditorTemplates для InvoicePartialCreateMainBillViewModel и InvoicePartialCreateDetailBillViewModel?   -  person    schedule 11.01.2016
comment
Да, я создал EditorTemplates для обеих ViewModels в папке представления.   -  person anand    schedule 11.01.2016


Ответы (1)


  1. Viewmodel поддерживает вложенные модели.

  2. Хотя не рекомендуется использовать виртуалку во ViewModel.

    открытый класс CreateInvoiceViewModel { public int EntityID { get; задавать; }

    public IList<InvoicePartialCreateMainBillViewModel> MainBill { get; set; }
    
    public IList<InvoicePartialCreateDetailBillViewModel> DetailBill { get; set; }
    

    }

    Виртуальный обычно используется с объектами предметной области, которые в конечном итоге используются для заполнения или сопоставления моделей представления.

    Хотя, это может полностью зависеть от вашего сценария.

    Например, у вас есть базовый класс со свойством A, а также производный класс 1 и производный класс 2. Оба нуждаются в свойстве A, но у них есть собственная реализация. Затем вы можете сохранить свойство A как виртуальное и переопределить его в любом из производных классов в соответствии с требованиями.

    Ex:

    public class BaseViewModel
    {           
       [Required]
       public virtual int propA { get; set;}           
    }
    
    public class DerivedViewModel1
    {
        ......
    }
    
    public class DerivedViewMode2
    {     
        public override int propA { get; set; }
    }
    

    В таком случае вы можете использовать виртуальное, иначе не рекомендуется.

person WriteTheCode    schedule 01.03.2016