在一个视图/控制器中显示3个型号

时间:2016-08-30 18:36:04

标签: c# asp.net-mvc entity-framework visual-studio razor

我是Entity和Visual Studio的新手。我有两个已填充数据的模型,第三个模型最初是控制器的一部分,我想实现其他两个模型。我不想编辑其他两个模型但只显示已经存在的数据表

我尝试使用本教程Multiple models in a view使用元组 但我无法使用@foreach语句。

@model Tuple<App.Models.ValueForecast, App.Models.FacilityEditor, App.Models.ForecastSub>

在一个视图中能够拥有三个模型的最简单方法是什么?其他两个模型必须能够显示其表数据中的数据。

我知道有一个带有viewModels的方法,但表中的数据没有显示,我使用了这个方法: Two models in one view in ASP MVC 3 但是没有用?

2 个答案:

答案 0 :(得分:3)

只需创建一个传输数据的对象,您需要区分您的域模型(问题的逻辑应该驻留在哪里),数据模型(通常是映射到数据库和东西的那些),以及您的数据传输对象(唯一的理由就是封装你要在方法之间传递的对象)。

当您将过多参数传递给一个方法时,或者在视图中需要多个对象时(需要讨论c#和Web开发),您需要一个DTO DTOs

即使在新的c#核心和他的网络开发部分,很多人都建议有一个名为&#34; ViewModels&#34;您可以在每个视图中放置一个视图模型,允许传递复杂对象。

澄清的其他链接:What are view models?

  

视图模型表示要在视图/页面上显示的数据,无论是用于静态文本还是用于可添加到数据库(或已编辑)的输入值(如文本框和下拉列表)。它与您的域模型不同。它是视图的模型。

因此,您应该创建一个新类,作为其他对象的容器,在您的情况下,如下所示:

public class NameOfTheviewViewModel {
    public App.Models.ValueForecast ValueForecast { get; set; }
    public App.Models.FacilityEditor FacilityEditor { get; set; }
    public App.Models.ForecastSub ForecastSub { get; set; }
}

然后使用此类作为视图的模型:

@model NameOfTheviewViewModel
foreach(var item in Model.ValueForecast) //Or whatever your list are
{
     // do something
}

答案 1 :(得分:0)

只需创建一个类(视图模型)来保存您需要的数据并将3个不同的域类数据映射到它(这可以手动完成,也可以使用AutoMapper之类的东西)。然后,您只需将此视图模型声明为视图的模型。

请注意,将域对象(PO​​CO)直接映射到View并不理想,因为您经常最终将特定于演示文稿的代码与数据访问层代码混合在一起。

将这些问题分离到包含所有POCO和表示层的数据层。然后,当您需要显示此数据时,创建一个ViewModel以在您的视图和控制器之间表示/传输此数据。这是一个更多的代码,但在我看来非常值得。