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