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.Customers
是 null
。如果在 POST 方法中 return 视图,则必须重新分配 ViewBag
属性 的值。假设Customers
包含属性CustomerID
和CustomerName
,那么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
的控件(您也不应该有一个)
我需要将来自不同 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.Customers
是 null
。如果在 POST 方法中 return 视图,则必须重新分配 ViewBag
属性 的值。假设Customers
包含属性CustomerID
和CustomerName
,那么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
的控件(您也不应该有一个)