这是暴露实体或DTO在mvc3中查看的最佳实践?

时间:2012-03-22 09:37:10

标签: asp.net-mvc-3 viewmodel

我已经创建了自己的定制批量架构,包括用于不同技术的n层层。

目前正在使用asp.net mvc框架开发n层架构。问题是我在数据访问层有实体框架。由于实体将拥有它的所有关系元数据和导航属性,因此它变得更重。我觉得直接在mvc视图上公开这些实体是不明智的。

我更喜欢在mvc视图中公开自己定制的实体模型,哪一个更轻。

但这也导致我将数据从原始实体转换为自定义模型的开销。

例如,我有一个Employee实体,它是从实体框架的edmx文件生成的。它包含总共20个具有所有导航属性的字段。

现在在mvc中查看我需要只显示2个字段进行编辑。

那么我们是否需要公开原始实体来查看或需要创建该两个字段的DTO /自定义模型而不是公开该视图?

2 个答案:

答案 0 :(得分:0)

你可以揭露原始实体,这没什么不好。但是,只要您需要有关该视图的其他信息,例如您需要FullName,而不是Name和Lastname,那么您应该创建一个只包含所需属性的EmployeeViewModel。您可以在操作中使用所需的值对其进行初始化,然后将其传递给视图。

答案 1 :(得分:0)

我会使用视图模型。我已经学会了不将我的域对象暴露给视图,而是将我的域对象映射到视图模型并将此视图模型返回到视图。

以下是部分视图模型,如果您需要更多员工数据来创建/编辑或显示,您可能拥有更多属性:

public class EmployeeViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }
}

在我的控制器的动作方法中,它看起来像这样:

public ActionResult Edit(int id)
{
     Employee employee = employeeRepository.GetById(id);

     // Mapping can be done here by using something like Auto Mapper, but I am
     // manually mapping it here for display purposes

     EmployeeViewModel viewModel = new EmployeeViewModel();
     viewModel.FirstName = employee.FirstName;
     viewModel.LastName = employee.LastName;

     return View(viewModel);
}

然后你的观点看起来像这样:

<td>First Name:</td>
<td>@Html.TextBoxFor(x => x.FirstName, new { maxlength = "15" })
    @Html.ValidationMessageFor(x => x.FirstName)
</td>

我更喜欢拥有一个只包含视图所需员工价值的视图模型。假设您的员工有20个属性,您只需更新2个字段,为什么然后将所有20个字段传递给视图? 仅使用您需要的内容。