【问题标题】:There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'GradingId'没有具有键“GradingId”的“IEnumerable<SelectListItem>”类型的 ViewData 项
【发布时间】:2015-04-26 09:53:47
【问题描述】:

我正在尝试为正在评分的用户获取一个下拉列表。每个用户可以有多个评分。因此,当我创建一个新成绩时,我想要一个下拉菜单来指定哪些用户将获得该成绩。

我不断得到:

没有具有键“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(视图)

@model FaceToFace.Model.Grading

    <h2>Create</h2>


    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()

        <div class="editor-label">
            @Html.LabelFor(model => model.User.CodeName, "User Name")
        </div>
        <div class="editor-field">
            @Html.DropDownList("GradingId", String.Empty)
        </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

grading.cs(模型)

namespace FaceToFace.Model
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    [Table("Grading")]
    public partial class Grading
    {
public int? User_UserID { get; set; }
        public virtual User User { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int GradingId { get; set; }

        public DateTime GradeDate { get; set; }
        public DateTime GradeEditDate { get; set; }
    }
}

User.cs(模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FaceToFace.Model
{
    public class User
    {
      public virtual ICollection<Grading> UserGradings { get; set; }   
    }
}

【问题讨论】:

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


    【解决方案1】:

    您可以使用Viewmodel 来避免此类问题。 Darin Dimitrov explains better 比我知道为什么你应该使用一个。

    您获得了 Intellisense,并且可以在视图中使用 Html 帮助程序的强类型版本。您还可以获得重构友好的代码,不再依赖魔术字符串。此外,仅查看强类型化到该视图的视图模型,就可以清楚地了解信息来自给定视图的位置。

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

    public class CreateGradeViewModel {
        Grading Grading { get; set; }
        IEnumerable<Grading> Gradings { get; set; }
    }
    

    将该模型用于您的视图,然后您可以将下拉集合作为视图模型的一部分传递。在此示例中,域对象作为视图模型的一部分包含在内。如果您需要对此进行更多控制,则可以使用域模型的属性而不是域对象,这将允许您使用数据注释。然后,您需要一个映射器将对象映射回您的域类型。

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

    【讨论】:

    • 谢谢,这会让为每个用户添加多个成绩更容易吗?截至目前,我无法做到这一点。即使我将它分配给新用户,我也只能整体打出一个成绩,它似乎没有认识到这一点。
    • 我相信我首先使用模型,但我实际上不知道如何找出我使用的是哪个模型。对不起我的无知。
    • 哦,以前从来没有这样过。基本上我猜你在UserGrade 之间有直接联系?您需要在它们之间添加一个链接表,其中包含User 的外键和Grade 的外键。这将使每个用户更容易获得多个成绩,是的。
    • 谢谢,如果是 EF 或 DB,我该怎么办,因为我不确定我使用的是哪一个。
    • EF 是一个 ORM,它将数据库记录映射到应用程序中的对象。使用 EF 最常见的三种方式是代码优先、模型优先和数据库优先。无论您使用哪个,就生成的文件而言,您通常会在大致相同的位置结束。
    【解决方案2】:

    Create 获取操作中,您没有使用导致 View 错误的 SelectList 设置 ViewBag.GradingId

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

    【讨论】:

    • 谢谢!非常感谢!
    • 这需要在 both GET 和 POST 操作中完成。否则,如果出现用户必须更正的错误,重新显示表单后下拉菜单将为空。
    • 哎呀。那个时机看起来很糟糕。这不是投反对票的理由。我没有对你投反对票。
    • @ChrisPratt OP 正在执行所有其他操作例外创建获取操作
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2020-08-20
      • 2011-02-20
      • 2015-03-11
      • 1970-01-01
      相关资源
      最近更新 更多