C# ViewModel不工作。从两个表中显示

C# ViewModel不工作。从两个表中显示,c#,asp.net-mvc,asp.net-mvc-5,viewmodel,models,C#,Asp.net Mvc,Asp.net Mvc 5,Viewmodel,Models,我正在尝试使用视图模型在视图中查看两个表中的信息,但它不起作用 这提供了两个包含信息的表格 public class HeatImage { [Key] public int ImageId { get; set; } public string name { get; set; } } public class HeatingArea { [Key] public int ID { get; set; } public string Area

我正在尝试使用视图模型在视图中查看两个表中的信息,但它不起作用

这提供了两个包含信息的表格

public class HeatImage
{
    [Key]
    public int ImageId { get; set; }
    public string name { get; set; }
}

public class HeatingArea
{
    [Key]
    public int ID  { get; set; }
    public string Area { get; set; } 

}
我的视图模型

public class HeatingAreaViewModel
{
    public IEnumerable<HeatImage> heatingImage { get; set; }
    public IEnumerable<HeatingArea> heatingArea { get; set; }
}
我的看法呢

@model IEnumerable<Project.Models.HeatingAreaViewModel>
 @foreach (var item in Model)
            {
                <a href="~/folder/@item.heatingImage">@item.heatingArea</a>
            }
@model IEnumerable
@foreach(模型中的var项目)
{
}
错误

传递到字典中的模型项的类型为 “Project.Models.HeatingAreaViewModel”,但此词典需要 类型的模型项 'System.Collections.Generic.IEnumerable'1[Project.Models.HeatingAreaViewModel]'


您的视图需要一个IEnumerable of HeatingAreaViewModel,似乎您只传递了一个实例

改变这个

@model IEnumerable<Project.Models.HeatingAreaViewModel>
然后,您将能够循环使用
heatingrea
heatingImage
这样的属性

@foreach (var item in model.heatingArea)
{
    //what ever you need to do here
}

错误消息告诉它:视图需要
HeatingAreaViewModel
IEnumerable
,而控制器操作只发送到视图
HeatingAreaViewModel


因此,请更正控制器以发送
HeatingAreaViewModel
列表,或更正视图以仅期望
HeatingAreaViewModel

的单个实例。如果您的问题是,如何在视图中的
HeatingImage
HeatingArea
两个列表中循环迭代,您必须重做viewModel:

public class HeatingAreaViewModel
{
    public HeatImage heatingImage { get; set; }
    public HeatingArea heatingArea { get; set; }
}
然后控制器动作:

    public ActionResult Index()
            {
                heatingAreas = db.HeatingAreas.ToList();
                heatingImages = db.HeatImages.ToList();

                List<HeatingAreaViewModel> myModel = heatingAreas.Zip(heatingImages, (a, b) => new HeatingAreaViewModel {HeatingArea = a, HeatImage = b})

                return View(mymodel);
            }
public ActionResult Index()
{
heatingreas=db.heatingreas.ToList();
heatingImages=db.HeatImages.ToList();
List myModel=heatingreas.Zip(heatingImages,(a,b)=>newheatingreaviewmodel{heatingrea=a,heatingImages=b})
返回视图(mymodel);
}
然后视图将按原样工作


然而,我强烈建议不要这样做。您必须确保两个列表中的对应元素实际上是相互对应的。这很容易出错。如果有一个底层逻辑将这两个列表连接在一起(数据库表上的某些关系),我将使用该逻辑将列表/表连接在一起。

只是视图中的模型与从控制器操作发送的不匹配,因此我认为您需要将视图更改为如下:

@model HeatingAreaViewModel
@foreach (var item in Model.heatingImage)
{
   <a href="~/folder/@item.heatingImage">@item.heatingArea</a>
}
@model List<Project.Models.HeatingViewModel>
@foreach (var item in Model)
{
     <p>item.HeatImage.Name</p>
     <p>item.HeatingArea.ID (I have used ID because I don't know what your Area looks like)</p>
}
@模型加热区域视图模型
@foreach(Model.heatingImage中的变量项)
{
}

您正在通过appels发送邮件,并希望收到橙子,这就是您收到错误的原因

在控制器中,您通过一(一)个
加热区域视图模型的实例进行发送。在您看来,您正在准备一个
HeatingAreaViewModel
实例列表(超过1个)

在阅读回复时,您希望在每个循环迭代中同时使用
HeatImage
heatingrea
。您需要更改视图模型以适应此情况。例如,创建一个视图模型,该模型可以同时容纳:

public class HeatViewModel
{
     public HeatImage HeatImage { get; set; }

     public HeatingArea HeatingArea { get; set; }
}
您将此
HeatViewModel
作为列表传递给您的视图

public ActionResult Index()
{
     // This is just dummy code
     HeatingViewModel model1 = new HeatingAreaViewModel();
     // Populate the properties
     model1.HeatImage = new HeatImage();
     // Populate the properties
     model1.HeatingArea = new HeatingArea();

     HeatingViewModel model2 = new HeatingAreaViewModel();
     // Populate the properties
     model2.HeatImage = new HeatImage();
     // Populate the properties
     model2.HeatingArea = new HeatingArea();

     // Now pass this list to the view
     List<HeatingViewModel> models = new List<HeatingViewModel>();

     return View(models);
}
…应该是

public HeatImage HeatImage { get; set; }

我希望这有帮助:)

顺便说一句,在MVC下,它被称为模型而不是“视图模型”@米奇,有模特和模特。见此帖:@ᴉʞuǝ谢谢你提到我的帖子/答案。请格式化你的代码,以便更好地阅读。谢谢,但是我怎样才能使heatingArea和heatingImage都在同一个循环中?我想创建这个链接
,我不确定你能否在一个循环中迭代两个IEnumerable。你能解释一下你到底想做什么吗
heatingImage
heatingArea
是两个独立的列表。@Xtreme,哦,那么你正在尝试解决一个不同的问题,如何将两个列表放在一起,而不是如何在MVC视图中显示,我将编写第二个答案,查看该答案以获得解决方案和进一步的注释。我如何更改我的控制器?@Xtreme,您不更改控制器,而是将视图更改为
model Project.Models.heatingreaviewmodel
,然后
@foreach(model.heatingImage中的var项)
和/或
@foreach(model.heatingrea中的var项)
@model List<Project.Models.HeatingViewModel>
@foreach (var item in Model)
{
     <p>item.HeatImage.Name</p>
     <p>item.HeatingArea.ID (I have used ID because I don't know what your Area looks like)</p>
}
public HeatImage heatImage { get; set; }
public HeatImage HeatImage { get; set; }