我已经创建了自己的定制批量架构,包括用于不同技术的n层层。
目前正在使用asp.net mvc框架开发n层架构。问题是我在数据访问层有实体框架。由于实体将拥有它的所有关系元数据和导航属性,因此它变得更重。我觉得直接在mvc视图上公开这些实体是不明智的。
我更喜欢在mvc视图中公开自己定制的实体模型,哪一个更轻。
但这也导致我将数据从原始实体转换为自定义模型的开销。
例如,我有一个Employee实体,它是从实体框架的edmx文件生成的。它包含总共20个具有所有导航属性的字段。
现在在mvc中查看我需要只显示2个字段进行编辑。
那么我们是否需要公开原始实体来查看或需要创建该两个字段的DTO /自定义模型而不是公开该视图?
答案 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个字段传递给视图? 仅使用您需要的内容。