我有以下实体和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并将Ticket
和ICollection<Attachment>
传递给控制器。另一方面,我不确定我是不是错了,因为我可以通过“Ticket&#39;通过将 Ticket 模型传递给 TicketViewModel 的构造函数,在控制器中创建TicketViewModel
的新实例。在这种情况下,我应该采用什么方法?
注意:我将IEnumerable<HttpPostedFileBase>
传递给控制台以获取附件数据。
更新
我更新了View并传递了Model而不是ViewModel,如下所示:
查看:
@model Ticket
//... some other stuff
在控制器中,我将附件模型和附件集合的新实例传递给数据层中的方法,如下所示。
的控制器:
List<FileAttachment> fa = new List<FileAttachment>();
答案 0 :(得分:1)
虽然真正的答案是主观的,完全基于个人偏好,但我会给你答案和理由。
传递所谓的视图模型通常比传递实体POCO更好,因为页面/表单可能需要的数据多于POCO中使用的数据。
在您提供的情况下,我会通过将属性合并到一个类中以便于绑定来展平视图模型中的类,然后创建一个Process()
函数来提供我需要的两个POCO。通常在处理复杂模型时,Process()
函数将返回要保存的新域模型,或接受域模型进行编辑。
例如,您可能希望以算术问题的形式提供廉价的机器人保护,而不需要在任何地方保存。传递视图模型还可以限制数据的暴露,以防后端人员与布置视图的人不同。
但在大多数情况下,POCO可以很好。我个人倾向于传递复杂数据的View Models,以及小表的实际POCO,例如只有两列是UID和文本字段。