0

作成アクション メソッドを使用してデータベースにデータを入力しようとしています。私のフォームの 2 つのフィールドはメニューのドロップダウンです。ドロップダウンは、create メソッドを介して最終的にメインの親テーブルに投稿される 2 つの個別の子テーブルにリンクされています。これらのドロップダウンに正しいデータを入力するのに非常に苦労しています。

私のモデル:

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ステートメントは終了しました。"}

ここで何か助けていただければ幸いです。

4

1 に答える 1

1

さて2つの問題があります。あなたが言ったように、あなたのドロップダウン人口は間違っているかもしれません。あなたが言うときDropDownListFor、それはあなたの最初のパラメータとしてモデルプロパティを求めます、あなたの場合それはあなただけCountyです。第二に、うまくいくかどうかわかりません。IEnumerable<SelectListItem>)ViewBag.CountyName試してみてください(SelectList)ViewBag.CountyName。また、可能であれば、IDをValueMembersとして使用しますただし、実際に使用するのが一意の値である場合を除きます。

County次に、データを保存するときに、エンティティとエンティティの両方をアタッチし直す必要がありますContact。そうしないと、コンテキストはそれらがエンティティであると見なし、追加しようとします。これにより、主キー違反が発生します。


それでは、次のようにコードを変更しましょう。

コントローラ:

// 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);
    }

これで少し遊んでください、それはうまくいくはずです。

于 2012-10-26T21:09:47.497 に答える