C# 没有类型为';IEnumerable<;选择列表项>';那有钥匙';GradingId';

C# 没有类型为';IEnumerable<;选择列表项>';那有钥匙';GradingId';,c#,asp.net,asp.net-mvc,linq,entity,C#,Asp.net,Asp.net Mvc,Linq,Entity,我正在尝试为正在评分的用户创建一个下拉列表。每个用户可以有多个渐变。因此,当我创建一个新的等级时,我需要一个下拉列表来指定将接收等级的用户 我不断得到: 没有具有键“GradingId”的“IEnumerable”类型的ViewData项 我已经研究了许多其他问题,但我无法确定我需要在控制器、视图或模型中更改什么 GradingController.cs public ActionResult Create() { return View();

我正在尝试为正在评分的用户创建一个下拉列表。每个用户可以有多个渐变。因此,当我创建一个新的等级时,我需要一个下拉列表来指定将接收等级的用户

我不断得到:

没有具有键“GradingId”的“IEnumerable”类型的ViewData项

我已经研究了许多其他问题,但我无法确定我需要在控制器、视图或模型中更改什么

GradingController.cs

 public ActionResult Create()
        {
            return View();
        }

        // POST: Gradings/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "GradingId,Eye,Cheek,Mouth,RestSymmetryTotal,RestSymmetryScore,VolForeheadWrinkle,VolGentleEyeClosure,VolOpenMouthSmile,VolSnarl,VolLipPucker,VolSymmetryTotal,VolSymmetryScore,SynForeheadWrinkle,SynGentleEyeClosure,SynOpenMouthSmile,SynSnarl,SynLipPucker,SynkinesisScore,CompositeScore")] Grading grading)
        {
            if (ModelState.IsValid)
            {
                grading.GradeDate = DateTime.Now;
                db.Gradings.Add(grading);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.GradingId = new SelectList(db.Gradings, "GradingId", "CodeName");
            return View(grading);
        }

        // GET: Gradings/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Grading grading = db.Gradings.Find(id);
            if (grading == null)
            {
                return HttpNotFound();
            }
            ViewBag.GradingId = new SelectList(db.Gradings, "GradingId", "CodeName");
            return View(grading);
        }

        // POST: Gradings/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "GradingId,Eye,Cheek,Mouth,RestSymmetryTotal,RestSymmetryScore,VolForeheadWrinkle,VolGentleEyeClosure,VolOpenMouthSmile,VolSnarl,VolLipPucker,VolSymmetryTotal,VolSymmetryScore,SynForeheadWrinkle,SynGentleEyeClosure,SynOpenMouthSmile,SynSnarl,SynLipPucker,SynkinesisScore,CompositeScore")] Grading grading)
        {
            if (ModelState.IsValid)
            {
                db.Entry(grading).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.GradingId = new SelectList(db.Gradings, "GradingId", "CodeName");
            return View(grading);
        }
Create.cshtml(视图)

User.cs(型号)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间FaceToFace.Model
{
公共类用户
{
公共虚拟ICollection UserGradings{get;set;}
}
}

创建
获取操作中,您没有使用SelectList设置
ViewBag.GradingId
,这会在视图中导致错误:

public ActionResult Create()
{
        ViewBag.GradingId = new SelectList(db.Gradings, "GradingId", "CodeName");
        return View();
}

Create
get action中,您没有使用SelectList设置
ViewBag.GradingId
,这会在视图中导致错误:

public ActionResult Create()
{
        ViewBag.GradingId = new SelectList(db.Gradings, "GradingId", "CodeName");
        return View();
}

您可以通过使用。达林·迪米特洛夫比我更了解你为什么要用它

您可以获得Intellisense,并且可以在视图中使用Html帮助程序的强类型版本。您还可以获得一个对重构友好的代码,不再依赖于神奇的字符串。另外,通过只查看强类型化视图的视图模型,可以清楚地知道给定视图的信息来自何处

对于创建页面,可以创建适当的Viewmodel

public class CreateGradeViewModel {
    Grading Grading { get; set; }
    IEnumerable<Grading> Gradings { get; set; }
}
公共类CreateGradeViewModel{
放坡{get;set;}
IEnumerable渐变{get;set;}
}
将该模型用于视图,然后可以将下拉集合作为视图模型的一部分进行传递。在本例中,域对象包含在视图模型中。如果需要对此进行更多控制,可以使用域模型的属性,而不是域对象,这将允许您使用数据注释。然后需要一个映射器将对象映射回您的域类型


您只需在控制器中更改
GET
方法以使用下拉值实例化模型,以及
POST
方法以接受视图模型并相应地对其进行操作。

您可以通过使用。达林·迪米特洛夫比我更了解你为什么要用它

您可以获得Intellisense,并且可以在视图中使用Html帮助程序的强类型版本。您还可以获得一个对重构友好的代码,不再依赖于神奇的字符串。另外,通过只查看强类型化视图的视图模型,可以清楚地知道给定视图的信息来自何处

对于创建页面,可以创建适当的Viewmodel

public class CreateGradeViewModel {
    Grading Grading { get; set; }
    IEnumerable<Grading> Gradings { get; set; }
}
公共类CreateGradeViewModel{
放坡{get;set;}
IEnumerable渐变{get;set;}
}
将该模型用于视图,然后可以将下拉集合作为视图模型的一部分进行传递。在本例中,域对象包含在视图模型中。如果需要对此进行更多控制,可以使用域模型的属性,而不是域对象,这将允许您使用数据注释。然后需要一个映射器将对象映射回您的域类型


您只需在控制器中更改
GET
方法以使用下拉值实例化模型,以及
POST
方法以接受视图模型并相应地对其进行操作。

尽管这不是您的问题的一部分,但一旦您开始操作,您将遇到完全不同的问题。
ViewBag
项目的名称不能与属性的名称相同。否则,所选值将永远不会被选择,因为
ViewBag
中的值将覆盖模型上的值


将选择列表命名为
GradingIdChoices
,而不是
GradingId
,以消除歧义

虽然这不是你问题的一部分,但一旦你开始使用它,你会遇到一个完全不同的问题。
ViewBag
项目的名称不能与属性的名称相同。否则,所选值将永远不会被选择,因为
ViewBag
中的值将覆盖模型上的值


将选择列表命名为
GradingIdChoices
,而不是
GradingId
,以消除歧义

谢谢!非常感谢!这需要在GET和POST操作中完成。否则,如果存在用户必须更正的错误,则在重新显示表单后,下拉列表将为空。这样做的时机看起来很糟糕。这不是投票失败的理由。我没有投你的反对票。@ChrisPratt OP在所有其他操作中都这么做了,除了Create Get action谢谢!非常感谢!这需要在GET和POST操作中完成。否则,如果存在用户必须更正的错误,则在重新显示表单后,下拉列表将为空。这样做的时机看起来很糟糕。这不是投票失败的理由。我没有投你的反对票。@ChrisPratt OP在所有其他操作中都这么做了,除了Create Get actionThankyou,这会让为每个用户添加多个分数更容易吗?到目前为止,我无法做到这一点。即使我把它分配给新用户,我也只能得到一个整体的分数,这似乎是无法识别的。我相信我首先使用的是模型,但我不知道如何才能找到我使用的是哪一个。对不起,我的无知。哦,以前从来没有这样做过。基本上我猜你在
用户
等级
之间有直接联系?您需要在之间添加一个链接表
public class CreateGradeViewModel {
    Grading Grading { get; set; }
    IEnumerable<Grading> Gradings { get; set; }
}