2016-08-16 11 views
3

EFを使用して新しいdbオブジェクトを作成する際に問題が発生しています。これには、プリセットビューを使用するときにドロップダウンメニューを使用して設定される外部キーがあります。MVCはドロップダウンなしで外部キーを設定しました

@Html.DropDownList("ParentID", null, htmlAttributes: new { @class = "form-control" }) 

問題は、私はこの値を編集したくないということです。コントローラに設定する必要がありますが、値にアクセスできません。

public ActionResult Create() 
{ 
    //I don't want a select list ParentID needs to be passed from the parent. 
    ViewBag.ParentID = new SelectList(db.Parents, "ParentID", "ParentName"); 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ChildID,ParentID,ChildName")] Child child) 
{ 
    if (ModelState.IsValid) 
    { 
     //How do I set child.ParentID without a select list??? 
     db.Child.Add(child); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.ParentID = new SelectList(db.Parents, "ParentID", "ParentName", child.ParentID); //I don't need this 
    return View(child); 
} 

これはどのような方法で実現できますか?

+0

...あなたのDropDownListコントロールで「無効」属性を追加しますか?それは(あなたのケースでは理にかなって) 'Create'アクション –

+0

メイクに渡され、メソッド 'public ActionResult Create(int ID)'を呼び出し、モデルを返すビューに( 'ParentId'が' ID'の値に設定されている)、ビューで '@Html.HiddenFor(m => m.ParentId)' –

答えて

1

あなたはたぶんParentIDを別のAction Methodから渡したいと思うかもしれませんが、なぜあなたはSelectList(そこに選択がない場合)を使ってそれをしたいのだろうと思います。

public ActionResult Create(int ParentID) 
{ 
    //I don't want a select list ParentID needs to be passed from the parent. 
    ViewBag.ParentID = ParentID; 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ChildID,ParentID,ChildName")] Child child) 
{ 
    if (ModelState.IsValid) 
    { 
     //How do I set child.ParentID without a select list??? 
     db.Child.Add(child); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return RedirectToAction("List"); 
} 

とビューで:

@Html.Hidden("ParentID", (object) ViewBag.ParentID) 

私はそれが進むべき道であるべきだと思います。

+0

'@Html.Hidden(" ParentID "、ViewBag .ParentID) 'が原因でエラーが発生する:HtmlHelper に 'Hidden'という名前のメソッドがありませんが、その名前で拡張メソッドがあるようです。拡張メソッドを動的にディスパッチすることはできません。動的引数をキャストするか、拡張メソッド構文を使用せずに拡張メソッドを呼び出すことを検討してください。 – Dom

+0

モデルが空のコレクションであるため、 '@ Html.ActionLink(" Create New Child "、" Create "、new {id = Model.SingleOrDefault()。Parent.ParentID})'を渡すためにIDにアクセスすることはできません。 – Dom

+0

動的な式であるので、 'object'にキャストする。編集された答えを参照する。 –

0

編集アクション(または、データを送信するための2つの編集アクション)を実装する必要があると思います。

シナリオを定義する必要があります。つまり、編集フォームで子エンティティの現在の「親」を変更する可能性があるかどうかを宣言する必要があります。そうでない場合は、エンティティが作成されました。

とにかく、「作成」操作をそのままにして、変更せずにそのまま表示する必要があります。このコントロールは複数の値の中から選択することができ、 "子"エンティティを作成するときに複数の親の中から選択する必要がありますので、ドロップダウンリストにparentIDを集めることが特に重要です。

限り「編集」アクションの懸念として、あなたは次のように実装することがありますが、それは子エンティティを作成した最初の時間が割り当てられていたらあなたの子供の現在の親を変更するために避けたい場合は

public ActionResult Edit(int? cId) 
{ 

    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 

    Child child = db.Child.Find(cId); 
    if (child == null) 
    { 
     return HttpNotFound(); 
    } 
    ViewBag.ParentID = new SelectList(db.Parents, "ParentID", "ParentName"); 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "ChildID,ParentID,ChildName")] Child child) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Child.Add(child); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    //You need this, because if you want change parent you can do it selecting from parents list 
    ViewBag.ParentID = new SelectList(db.Parents, "ParentID", "ParentName", child.ParentID); 
    return View(child); 
} 

、それが必要それは次のようにあなたから取得PARENTIDをしたいんところ質問は

@Html.DropDownList("ParentID", null, htmlAttributes: new { @disabled = "disabled" } }) 
関連する問題