Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:如何处理具有许多属性的视图模型?_C#_Asp.net Mvc_Viewmodel - Fatal编程技术网

C# ASP.NET MVC:如何处理具有许多属性的视图模型?

C# ASP.NET MVC:如何处理具有许多属性的视图模型?,c#,asp.net-mvc,viewmodel,C#,Asp.net Mvc,Viewmodel,因此,我的视图与视图模型的比例几乎是1:1,而且一切似乎进展顺利。如果我正确理解了它们的用途,那么视图模型似乎应该“剥离”实体模型,以便只将相关属性传递到表示层,添加表示所需的其他信息,例如创建地址时的状态缩写或联系人类型列表。 在努力遵守这些原则的过程中,我的报表控制器有点撞到墙了。为客户生成的各种报告需要访问大约30个不同的属性。因此,我的视图模型最终看起来与实体模型非常相似 当然,最简单的解决方案是将实体模型传递给视图,这样我就可以访问所有属性,但是我还需要能够为空白或“不完整”客户生成报

因此,我的视图与视图模型的比例几乎是1:1,而且一切似乎进展顺利。如果我正确理解了它们的用途,那么视图模型似乎应该“剥离”实体模型,以便只将相关属性传递到表示层,添加表示所需的其他信息,例如创建地址时的状态缩写或联系人类型列表。

在努力遵守这些原则的过程中,我的报表控制器有点撞到墙了。为客户生成的各种报告需要访问大约30个不同的属性。因此,我的视图模型最终看起来与实体模型非常相似

当然,最简单的解决方案是将实体模型传递给视图,这样我就可以访问所有属性,但是我还需要能够为空白或“不完整”客户生成报告。这会导致在尝试访问实体模型上的导航属性时出现空引用异常问题

因此,我可以对视图中的几乎每个字段使用空检查,这似乎不太吸引人。。。或者我可以实现一个视图模型来避免空引用异常。问题是我最终得到的视图模型如下所示:

var customer = customersRepository.GetCustomer(id);
var viewModel = new CustomersViewModel()
{
    FirstName = customer.FirstName,
    LastName = customer.LastName,
    Address = customer.MailingAddress.Address,
    City = customer.MailingAddress.City,
    // and on and on for about 30 different properties
};
return View(viewModel);
键入所有这些属性是感觉不对的事情之一。我是否错过了一个更优雅的解决方案

键入所有这些属性是感觉不对的事情之一

无论你想达到哪一个级别,最终你都必须输入all

因此,我认为这种方法同样可行

问题是我最终得到的视图模型是这样的


必须避免完全按照您发布的代码编写。我还建议您观看来自AutoMapper创建者的精彩视频。看了这段视频后(以及你这边的一点努力),你的控制器动作将减少到一行。

你一定要看看AutoMapper()

AutoMapper.Mapper.CreateMap(typeof(CustomerModel)、typeof(CustomerViewModel));
AutoMapper.Mapper.CreateMap()
.FormMember(d=>d.Property1,f=>f.MapFrom(s=>s.Property1))
.ForMember(d=>d.Property2,f=>f.MapFrom(s=>s.Property2))
.ForMember(d=>d.Property3,f=>f.MapFrom(s=>s.Property3));

我真的不明白你在这里想要达到的目的。。写更多的代码没有错。。代码的大小无关紧要,只要它是具体的、组织良好的。您应该担心的是如何减少数据库交互,只从数据库中检索所需的属性

正如代码所示,您检索整个customer对象,然后显示一些属性,为什么不只检索您需要的属性呢


另外,如果您使用的是MailingAddress的属性,为什么不将整个MailingAddress对象作为属性传递呢?为什么要拆分为其他属性。

+1在Automapper上,我发现它对于这种域模型>视图模型映射非常有价值。谢谢!找到一个完美的解决方案总是很好的。嗯……如果它早点告诉我答案已经添加了,那当然很好。我关心的是控制器中的所有代码。看来Automapper解决了这个问题。您建议用什么来代替从存储库中获取客户对象?从存储库返回视图模型似乎是错误的,因为域模型应该不知道表示层。
AutoMapper.Mapper.CreateMap(typeof(CustomersModel), typeof(CustomersViewModel));

AutoMapper.Mapper.CreateMap<CoolObject, CoolObjectViewModel>()
    .ForMember(d => d.Property1, f => f.MapFrom(s => s.Property1))
    .ForMember(d => d.Property2, f => f.MapFrom(s => s.Property2))
    .ForMember(d => d.Property3, f => f.MapFrom(s => s.Property3));