我有两个类,第一个是基类,第二个是从第一个继承的。
public class hgm
{
}
public class Laboratory : hgm
{
}
我使用EF Code First来生成数据库。此外,我使用默认的Scaffold来生成控制器和视图。
我可以使用编辑,创建,详细信息页面但是对于索引(实例列表),有一个错误:
传递到字典中的模型项的类型为
'System.Collections.Generic.List'1[armnab.Models.hgm]'
,但此字典需要类型为'System.Collections.Generic.IEnumerable'1[armnab.Models.Laboratory]'
的模型项
这是我的控制器:
public class LaboratoriesController : Controller
{
private hgmContext db = new hgmContext();
// GET: Laboratories
public ActionResult Index()
{
return View(db.hgms.ToList());
}
}
和视图:
@model IEnumerable<armnab.Models.Laboratory>
<h2>Index</h2>
为什么会出现此错误?
答案 0 :(得分:2)
如果Lab继承自hgm,您应该通过控制器中的实验室列表或更改此项
IEnumerable<armnab.Models.Laboratory>
对此
IEnumerable<armnab.Models.hgm>
。
除非你明确指出它,否则实验室是一个hgm hgm不一定是实验室,所以你不能只是分配它。
答案 1 :(得分:1)
由于您的DbContext正在返回hgm
个实例,并且您希望填充为Laboratories实现的视图,因此您需要将值转换为实验室类型。由于您无法保证DbContext仅返回实验室实例(考虑到您的问题的范围),Cast
运算符可能会抛出异常。
根据问题中的信息,最佳选择是OfType
,它不会返回不正确类型的值。
public ActionResult Index()
{
return View(db.hgms.OfType<Laboratory>());
}
答案 2 :(得分:0)
你的观点是期待一个IEnumerable实验室。你要回来了
List<hgm>
而不是
List<Laboratory>
您可能真的想要返回db.Laboratories.ToList()或者如果hgm对象将Laboraties作为属性,则需要选择hgm满足条件并从此返回Laboratories
var result = db.hgm.Where(x => x.someProperty == someValue).ToList();
if(result.Count > 0)
{
return hgm.Laboratories;
}
答案 3 :(得分:0)
泛型类(read this for additional details)中没有继承
如果从DB中选择的所有对象都是laboratory
个对象,则可以使用Cast<Laboratory>
linq方法。如果您希望将所有hgm
个对象视为laboratory
个对象,则需要为从db获取的每个laboratory
创建新的hgm
对象并映射所有属性(您可以使用某些库,例如AutoMapper或ValueInjecter)
public ActionResult Index()
{
return View(db.hgms.Select(x => GetLaboratoryFromHgm(x));
}
private Laboratory GetLaboratoryFromHgm(Hgm obj)
{
var lab = new Laboratory();
//map all the properties here
}