ViewModel无法正常工作。从两个表中显示

时间:2015-11-15 22:31:44

标签: 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 { get; set; } 

}

我的viewmodel

public class HeatingAreaViewModel
{
    public IEnumerable<HeatImage> heatingImage { get; set; }
    public IEnumerable<HeatingArea> heatingArea { get; set; }
}

我的控制器

  public ActionResult Index()
        {
            HeatingAreaViewModel mymodel = new HeatingAreaViewModel();
            mymodel.heatingArea = db.HeatingAreas.ToList();
            mymodel.heatingImage = db.HeatImages.ToList();

            return View(mymodel);
        }

我的观点

@model IEnumerable<Project.Models.HeatingAreaViewModel>
 @foreach (var item in Model)
            {
                <a href="~/folder/@item.heatingImage">@item.heatingArea</a>
            }

错误

  

传递到字典中的模型项是类型的   'Project.Models.HeatingAreaViewModel',但是这个字典需要一个   型号项目   'System.Collections.Generic.IEnumerable`1 [Project.Models.HeatingAreaViewModel]'。

5 个答案:

答案 0 :(得分:1)

错误消息告诉它:视图需要object Generic { type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 } def apply[T](implicit gen: Generic[T]): Aux[T, gen.Repr] = gen implicit def materialize[T, R]: Aux[T, R] = macro GenericMacros.materialize[T, R] } IEnumerable,而您的控制器操作仅向视图发送HeatingAreaViewModel

因此,要么更正控制器以发送HeatingAreaViewModel列表,要么更正视图以仅预期HeatingAreaViewModel的单个实例。

答案 1 :(得分:1)

您正在通过追踪并期待橘子,这就是您收到错误的原因。

在您的控制器中,您通过HeatingAreaViewModel的单个(一个)实例发送。在您的视图中,除了HeatingAreaViewModel个实例列表(超过1个)之外,您正在进行规定。

通过阅读回复,您希望在每次循环迭代中同时使用HeatImageHeatingArea。您需要更改视图模型以适应这种情况。例如,创建一个可以同时包含以下内容的视图模型:

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);
}

在您看来,您的代码看起来像这样:

@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; }

我希望这会有所帮助:)

答案 2 :(得分:0)

你的视图期待一个IEnumerable的HeatingAreaViewModel,好像你只传递了一个实例。

更改此

include /etc/nginx/sites-enabled/*.conf;
include /etc/nginx/sites-enabled/app.example.com;
include /etc/nginx/sites-enabled/www.example.com;

到这个

@model IEnumerable<Project.Models.HeatingAreaViewModel>

然后,您就可以遍历@model Project.Models.HeatingAreaViewModel heatingArea这样的属性

heatingImage

答案 3 :(得分:0)

如果您的问题是,如何在您的视图中通过两个HeatingImageHeatingArea列表循环,您必须重做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);
            }

然后View将按原样运行。

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

答案 4 :(得分:0)

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

@model HeatingAreaViewModel
@foreach (var item in Model.heatingImage)
{
   <a href="~/folder/@item.heatingImage">@item.heatingArea</a>
}