字典错误传递数据以查看

时间:2017-11-26 20:56:04

标签: c# asp.net-mvc entity-framework

我正在使用实体框架为我的大学做一个项目,我需要从表中获取多个数据而不相互引用。我们的想法是在列表中显示基本信息,当您单击“详细信息”按钮时,它会显示所有信息,包括与此表无关的信息。

我试图在控制器中执行此操作,但遗憾的是,没有成功:

public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }


        ProcessArea processArea = db.ProcessArea.Find(id);
        if (processArea == null)
        {
            return HttpNotFound();
        }


        var query = from ap in db.ProcessArea
                    join mg in db.GenericGoal on ap.IdProcessArea equals mg.IdGenericGoal
                    select new ProcessAreaModelView()
                    {
                        InitialsLevelMaturity = mg.Initials,
                        NameLevelMaturity = mg.Name,
                        DescriptionLevelMaturity = mg.Description,
                        Initials = ap.Initials,
                        Name = ap.Name,
                        Description = ap.Description
                    };
        query.ToList();


        return View(query);
    }

我有一个名为“Process Area”的模型,因为我不得不加入我认为我必须有另一个模型,因为它们是不同的信息所以我创建了“ProcessAreaModelView”

当我点击“详细信息”时,会出现错误:

  

插入字典中的模板项的类型为'System.Data.Entity.Infrastructure.DbQuery'1 [AkaelApp.Models.AreaProcessoModelView]',但此字典需要一个类型为'AkaelApp.Models.AreaProcessoModelView'的项目。

我做错了什么?

3 个答案:

答案 0 :(得分:0)

错误消息显示,您的视图强烈输入AreaProcessoModelView,但您的代码传递的IQIeryable为AreaProcessoModelView

您需要将LINQ查询执行的结果传递给视图,而不是查询。由于您的查询表达式将返回一个集合,因此您需要在集合上调用FirstFirstOrDefault方法以获取需要传递给视图的单个项目。您的视图是强类型的单个对象,而不是集合

你也在Find上调用db.ProcessArea方法,但实际上并没有使用它(除了检查它是否存在)。您可以将where子句添加到LINQ查询中。

public ActionResult Details(int? id)
{
    if (id == null)
    {
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }    
     var item = (from ap in db.ProcessArea
                    join mg in db.GenericGoal on ap.IdProcessArea equals mg.IdGenericGoal
                    where ap .Id == id.Value
                    select new AreaProcessoModelView()
                    {
                        InitialsLevelMaturity = mg.Initials,
                        NameLevelMaturity = mg.Name,
                        DescriptionLevelMaturity = mg.Description,
                        Initials = ap.Initials,
                        Name = ap.Name,
                        Description = ap.Description
                    }).FirstOrDefault();

   if(item ==null)
   {
        return HttpNotFound();  // Or a return a view with message "item not found"
   }
   return View(item);
}

这应该可以正常运行,假设您的详细信息视图强类型为AreaProcessoModelView类。

答案 1 :(得分:0)

您需要传递AreaProcessoModelView的单个实例,而不是查询。

return View(query.Single());

答案 2 :(得分:0)

查询返回一个列表 - 但您需要一个对象。您可以使用query.FirstOrDefault()获取第一个匹配项(如果多个匹配项是您要检测的错误,则可以使用SingleOrDefault())。你不需要query.ToList() BTW(你真的丢弃了结果)。