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

时间:2015-03-02 20:15:52

标签: c# asp.net-mvc asp.net-mvc-5

我有两个类,第一个是基类,第二个是从第一个继承的。

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>

为什么会出现此错误?

4 个答案:

答案 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对象并映射所有属性(您可以使用某些库,例如AutoMapperValueInjecter

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
}
相关问题