我正在尝试使用视图模型查看视图中两个表的信息,但它不起作用。
这给出了两个包含信息的表格。
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]'。
答案 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个)之外,您正在进行规定。
通过阅读回复,您希望在每次循环迭代中同时使用HeatImage
和HeatingArea
。您需要更改视图模型以适应这种情况。例如,创建一个可以同时包含以下内容的视图模型:
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)
如果您的问题是,如何在您的视图中通过两个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);
}
然后View将按原样运行。
但是,我强烈建议不要这样做。您必须确保两个列表中的相应元素实际上彼此对应。哪个很容易出错。如果存在将这两个列表连接在一起的基础逻辑(数据库表上的某些关系),我将使用该逻辑将列表/表连接在一起,而不是。
答案 4 :(得分:0)
只是视图中的模型与控制器操作发送的模型不匹配,所以我认为您需要将视图更改为:
@model HeatingAreaViewModel
@foreach (var item in Model.heatingImage)
{
<a href="~/folder/@item.heatingImage">@item.heatingArea</a>
}