Error: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Customer'

Error: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Customer'

我需要将来自不同 table 的所有客户(即客户)获取到工单表单中。

我的模态....

public class Ticket
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required()]
    public Int32 TicketID { get; set; }
    public Int32 TicketNum { get; set; }
    [Required()]
    public DateTime TicketDate { get; set; }

    [ForeignKey("Customer")]
    public Int32 CustomerID { get; set; }
    [Required(ErrorMessage ="Customer Name is required!!")]
    [Display(Name ="Customer Name")]
    public String CustomerName { get; set; }

    public Int32 FieldID { get; set; }
    public Int32 WellID { get; set; }
    public Int32 WellName { get; set; }
    public Int32 LogID { get; set; }

    public IEnumerable<SelectListItem> Customers { get; set; }
    public virtual Customer Customer { get; set; }
  //  public virtual Field Field { get; set; }
   // public virtual Well Well { get; set; }
  //  public virtual Log Log { get; set; }

}

我的控制器...

[HttpPost]
    public ActionResult Create(Ticket ticket)
    {
        //Very important step
        if (!ModelState.IsValid)
        {
            return View(ticket);
        }
        Console.WriteLine("Customer: ");

        ViewBag.Customers = new SelectList(context.Customers.ToList());
        try {
              context.Tickets.Add(ticket);
              context.SaveChanges();
        }
        catch(Exception ex)
        {
            ModelState.AddModelError("Error:" , ex.Message);
            return View(ticket);
        }
        TempData["Message"] = "Created " + ticket.TicketID;

        return RedirectToAction("Index");

    }

我的观点......

<div class="form-group">
        @Html.LabelFor(model => model.TicketDate, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.TicketDate, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.TicketDate, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CustomerName, "Customer", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
          @Html.DropDownList("Customers", (IEnumerable<SelectListItem>)(ViewBag.Customers), htmlAttributes: new { @class = "form-control" }) 
            @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })
        </div>
    </div>

我知道有很多关于此的帖子,我尝试了每个帖子。

首先,您不能将 ViewBag 属性 命名为与绑定到的 属性 相同的名称,但看起来您还是想绑定到 CustomerID,所以您的视图应该是(始终使用强类型 HtmlHelper 方法)

 @Html.DropDownListFor(m => m.CustomerID, (IEnumerable<SelectListItem>)(ViewBag.Customers), htmlAttributes: new { @class = "form-control" }

接下来,你得到异常的原因是因为 ViewBag.Customersnull。如果在 POST 方法中 return 视图,则必须重新分配 ViewBag 属性 的值。假设Customers包含属性CustomerIDCustomerName,那么GET方法中的代码需要是

ViewBag.Customers = new SelectList(context.Customers, "CustomerID", "CustomerName");

并在 POST 方法中

if (!ModelState.IsValid)
{
    // Reassign the SelectList
    ViewBag.Customers = new SelectList(context.Customers, "CustomerID", "CustomerName");
    return View(ticket);
}
Console.WriteLine("Customer: ");

// ViewBag.Customers = new SelectList(context.Customers.ToList()); Remove this
try {
    ....

最后,根据您展示的视图,您需要删除具有[Required]属性的属性 public string CustomerName { get; set; },这意味着ModelState将永远无效。您有一个用于选择需要绑定到 CustomerID 的客户的下拉列表,并且您没有用于绑定到 CustomerName 的控件(您也不应该有一个)