通过Html Dropdownfor MVC3 /实体框架使用子表数据填充DB

时间:2012-10-26 20:40:52

标签: c# asp.net-mvc-3 frameworks entity

我正在尝试使用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语句已终止。”}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

有两个问题。正如你所说,你的下降人口可能是错误的。当您说DropDownListFor时,它会将您的fisrt参数作为模型属性,在您的情况下,它只是您的County。其次,我不确定IEnumerable<SelectListItem>)ViewBag.CountyName是否有效,请尝试(SelectList)ViewBag.CountyName。并且,如果可能,请使用 ID 作为ValueMembers,除非您真正使用的是唯一值。

其次,当您存储数据时,您需要附加CountyContact个实体,否则上下文会认为这些是您的实体并尝试添加它们,这会导致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);
    }

用这个玩一下,应该可以。