我应该在创建页面中使用哪一个:Model或ViewModel?

时间:2015-06-14 21:40:37

标签: c# asp.net-mvc asp.net-mvc-viewmodel asp.net-mvc-controller

我有以下实体和ViewModel(为清晰起见,删除了一些属性):

票:

public class Ticket
{
    [Key] 
    public int ID { get; set; }

    public string Comment { get; set; }

    //Navigation Property
    public virtual ICollection<Attachment> Attachments { get; set; }
}


附件:

public class Attachment
{
    [Key]
    public int ID { get; set; }

    //Foreign key for Ticket
    public int TicketID { get; set; }

    public byte[] FileData { get; set; }

    public string FileMimeType { get; set; }

    //Navigation Property 
    public virtual Ticket Ticket { get; set; }
}


TicketViewModel:

public class TicketViewModel
{
    //Default constructor
    public TicketViewModel()
    {

    } 

    //Constructor with parameter
    public TicketViewModel(Ticket ticket)
    {
        Ticket = ticket;
        Attachment = new Attachment();
    }

    public Ticket Ticket { get; set; }

    public Attachment Attachment { get; set; }  

    public virtual ICollection<Attachment> Attachments { get; set; }              
}


在“创建新故障单”页面中,还有附件字段,并且可以将多个附件添加到此新创建的故障单中。出于这个原因,我使用TicketViewModel并将TicketICollection<Attachment>传递给控制器​​。另一方面,我不确定我是不是错了,因为我可以通过“Ticket&#39;通过将 Ticket 模型传递给 TicketViewModel 的构造函数,在控制器中创建TicketViewModel的新实例。在这种情况下,我应该采用什么方法?
注意:我将IEnumerable<HttpPostedFileBase>传递给控制台以获取附件数据。


更新

我更新了View并传递了Model而不是ViewModel,如下所示:

查看:

@model Ticket
//... some other stuff

在控制器中,我将附件模型和附件集合的新实例传递给数据层中的方法,如下所示。


控制器:

List<FileAttachment> fa = new List<FileAttachment>();

1 个答案:

答案 0 :(得分:1)

虽然真正的答案是主观的,完全基于个人偏好,但我会给你答案和理由。

传递所谓的视图模型通常比传递实体POCO更好,因为页面/表单可能需要的数据多于POCO中使用的数据。

在您提供的情况下,我会通过将属性合并到一个类中以便于绑定来展平视图模型中的类,然后创建一个Process()函数来提供我需要的两个POCO。通常在处理复杂模型时,Process()函数将返回要保存的新域模型,或接受域模型进行编辑。

例如,您可能希望以算术问题的形式提供廉价的机器人保护,而不需要在任何地方保存。传递视图模型还可以限制数据的暴露,以防后端人员与布置视图的人不同。

但在大多数情况下,POCO可以很好。我个人倾向于传递复杂数据的View Models,以及小表的实际POCO,例如只有两列是UID和文本字段。