【问题标题】:Displaying 3 Models In One View/Controller在一个视图/控制器中显示 3 个模型
【发布时间】:2017-01-07 04:04:17
【问题描述】:

我是 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 但没有工作

【问题讨论】:

  • 你不能 @foreach 一个元组,但是如果元组的属性之一实现了 IEnumerable,你可以。是这样吗?列出的元组是哪种类型?
  • @Will,是的,我明白了,我在其他 stackoverflow 页面中看到了这一点,但我还能怎么做呢?
  • 为什么链接的答案对您不起作用?您是如何实施该解决方案的?
  • 我认为这里没有问题。你说你不能@foreach 某事,但你没有告诉我们你想要@foreach 的确切什么。有点问题,想帮你。
  • Foreach 仅适用于 IEnumerables。什么在这里实现了 IEnumerable?

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


【解决方案1】:

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

当您向一个方法传递太多参数时,或者当您的视图中需要多个对象时(谈论 c# 和 Web 开发),您需要一个 DTO DTOs.

即使在新的 c# 核心和他的 web 开发部分,很多人建议有一个名为“ViewModels”的文件夹,您可以在其中为每个视图放置一个视图模型,从而允许传递复杂的对象。

其他澄清链接: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
}

【讨论】:

  • 我应该使用元组还是继续使用“@model IEnumerable
  • @johndoesnow 你需要创建一个类来保存你的数据,而不是一个元组。然后,您可以在处理数据时使用这个 View Model 类。
  • @rekiem87 我创建了一个单独的类,完全按照您的操作方式并将其放入名为 ViewModel 的文件夹中,然后执行:模型 RogersExcel.ViewModel.ValueForecastModels,当我使用 foreach 时(Model.valueForecast 中的 var 项) ,我收到一个错误:CS1579:foreach 语句无法对“App.Models.ValueForecast”类型的变量进行操作,因为“App.Models.ValueForecast”不包含“GetEnumerator”的公共定义
  • @rekiem87 我在尝试运行 foreach 语句时不断收到 GetEnumerator 错误
  • @rekiem87 当我删除该语句时出现此错误:传递到字典中的模型项的类型为“System.Collections.Generic.List`1[App.Models.ValueForecast]”,但是此字典需要“App.ViewModel.ValueForecastModels”类型的模型项。
【解决方案2】:

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

请注意,将您的域对象 (POCO) 直接映射到您的视图并不理想,因为您通常最终会将特定于表示的代码与数据访问层代码混合在一起。

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

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2015-10-17
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多