我正在尝试使用create action方法填充数据库。我的表单上的两个字段是下拉菜单。下拉列表链接到两个单独的子表,这些子表最终将通过create方法发布在我的主父表上。我很难让这些下拉列表填充正确的数据。
我的模特:
public class County
{
[Key]
public string CountyName { get; set; }
}
public class Contact
{
[Key]
public int ContactId { get; set; }
public string ContactName { get; set; }
public class InspectionInfo
{
[Key]
public int InspectionId { get; set; }
//[Required]
public Contact Contact { get; set; }
//[Required]
public County County { get; set; }
我的控制器:
//
// GET: /Inspection1/Create
public ActionResult Create()
{
var model = new InspectionInfo
{
Submitted = DateTime.Now,
//Contact = new Contact()
};
ViewBag.CountyName = new SelectList(db.Counties,"CountyName", "CountyName");
ViewBag.Contactname = new SelectList(db.Contacts, "ContactName", "ContactName");
return View(model);
}
//
// POST: /Inspection1/Create
[HttpPost]
public ActionResult Create(InspectionInfo inspectioninfo)
{
if (ModelState.IsValid)
{
db.InspectionInfos.Add(inspectioninfo);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(inspectioninfo);
}
我的观点:
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.County )
</div>
<div class="editor-field">
@Html.DropDownListFor(m=>m.County.CountyName,(IEnumerable<SelectListItem>)ViewBag.CountyName)
@Html.ValidationMessageFor(model => model.County)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact)
</div>
<div class="editor-field">
@Html.DropDownListFor(m=>m.Contact.ContactName, (IEnumerable<SelectListItem>)ViewBag.ContactName)
@Html.ValidationMessageFor(model => model.Contact)
</div>
目前,在休息期间检查字段值时,我继续收到ContactName的“1”。
另外,我收到了CountyName的例外情况:
{“违反PRIMARY KEY约束'PK_dbo.Counties'。无法在对象'dbo.Counties'中插入重复键。\ r \ n语句已终止。”}
非常感谢任何帮助。
答案 0 :(得分:1)
有两个问题。正如你所说,你的下降人口可能是错误的。当您说DropDownListFor
时,它会将您的fisrt参数作为模型属性,在您的情况下,它只是您的County
。其次,我不确定IEnumerable<SelectListItem>)ViewBag.CountyName
是否有效,请尝试(SelectList)ViewBag.CountyName
。并且,如果可能,请使用 ID 作为ValueMembers,除非您真正使用的是唯一值。
其次,当您存储数据时,您需要附加County
和Contact
个实体,否则上下文会认为这些是您的实体并尝试添加它们,这会导致PRIMARY KEY冲突。
所以,让我们修改你的代码,如:
控制器:
// Use the entity id here...
ViewBag.CountyName = new SelectList(db.Counties,"CountyId", "CountyName");
页:
@Html.DropDownListFor(m=>m.County.CountyName,(SelectList)ViewBag.CountyName)
在您的控制器上:
[HttpPost]
public ActionResult Create(InspectionInfo inspectioninfo)
{
if (ModelState.IsValid)
{
db.InspectionInfos.Add(inspectioninfo);
db.Contact.Attach(inspectioninfo.Contact);
db.County.Attach(inspectioninfo.County);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(inspectioninfo);
}
用这个玩一下,应该可以。