C# 控制器返回与视图不匹配的值?

C# 控制器返回与视图不匹配的值?,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我有两个类,第一个是基类,第二个继承自第一个 public class hgm { } public class Laboratory : hgm { } 我首先使用EF代码生成数据库。此外,我使用默认的脚手架生成控制器和视图 我可以使用编辑、创建和详细信息页面,但对于索引(实例列表),存在错误: 传入字典的模型项的类型为'System.Collections.Generic.List'1[armnab.Models.hgm],但此字典需要类型为'System.Collections.Ge

我有两个类,第一个是基类,第二个继承自第一个

public class hgm
{ 
}

public class Laboratory : hgm
{
}
我首先使用EF代码生成数据库。此外,我使用默认的脚手架生成控制器和视图

我可以使用编辑、创建和详细信息页面,但对于索引(实例列表),存在错误:

传入字典的模型项的类型为
'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>
@model IEnumerable
指数

为什么会发生此错误?

如果实验室从hgm继承,则您应该在控制器中传递实验室列表或更改此列表
IEnumerable
到此
IEnumerable


除非您显式地对其进行类型转换,当实验室是hgm时,hgm不一定是实验室,因此您不能仅分配它

您的视图需要一个数量可观的实验室。你正在退回一张支票

List<hgm> 

泛型类中没有继承()
如果从DB中选择的所有对象都是
laboratory
对象,则可以使用
Cast
linq方法。如果您希望所有
hgm
对象都被视为
laboratory
对象,则需要为从db获得的每个
hgm
对象创建新的
laboratory
对象,并映射所有属性(您可以使用一些库来进行类似或类似操作)


由于DbContext正在返回
hgm
实例,并且希望填充为实验室实现的视图,因此需要将值强制转换为实验室类型。由于不能保证DbContext只返回实验室实例(考虑到问题的范围),因此
Cast
操作符可能会抛出异常

根据问题中的信息,最好的选择是
of type
,它不会返回类型不正确的值

public ActionResult Index()
{
    return View(db.hgms.OfType<Laboratory>());
}
public ActionResult Index()
{
返回视图(db.hgms.OfType());
}

您的操作返回一个
列表
,但您的视图需要一个
IEnumerable
Laboratory
是您的
hgm
的属性吗?建议阅读:您是否试图筛选可能包含非实验室的hgms的集合,或者db.hgms是否保证只包含实验室实例?Laboratories不是hgm的属性,Laboratory类派生自hgm。好的,那么只需db.hgms.Cast()无需先将其放入列表,因为Cast返回IEnumerablet如果您假设db.hgms返回一个
hgm
,则转换会以另一种方式进行,这似乎来自错误消息。
var result = db.hgm.Where(x => x.someProperty == someValue).ToList();
if(result.Count > 0)
{
   return hgm.Laboratories;
}
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
}
public ActionResult Index()
{
    return View(db.hgms.OfType<Laboratory>());
}