2016-03-31 14 views
0

私はちょうど質問をしたい、私はASP.Net MVCの初心者です。ActionResult 2つのテーブル(1対1)を持つEntity Frameworkを使用してMVCで編集しますか?

これは私の場合です:

私は2つのテーブルを持っている...

学生表:ID(主キー)、名前、およびクラス バッグ表:ID(主キー)、ブランド

ID(学生)ID(袋)との関係 つの関係の一つには、..

これは私のコントローラのコードである

// POST: Students/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Nama,Kelas,Brand")] Student Student, Bag Bag) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Students.Add(Student); 
      Bag.Id = Student.Id; 
      db.Bag.Add(Bag); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.Id = new SelectList(db.Bag, "Id", "Brand", Student.Id); 
     return View(Student); 
    } 
    // POST: Students/Edit/5 
    // To protect from overposting attacks, please enable the specific you to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "Id,Nama,Kelas,Brand")] Student Student, Bag Bag) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(Student).State = EntityState.Modified; 
      //db.Entry(Bag).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.Id = new SelectList(db.Bag, "Id", "Brand", Student.Bag.Id); 
     ViewBag.Id = new SelectList(db.Students, "Id", "Nama", Student.Id); 

     return View(Student); 
    } 

with ActionResult ID、名前、ブランドを追加できますが、フィールドの編集/更新方法が混乱します。ブラウザで編集をクリックするとID、名前、クラスは編集できますが、ブランドdidn

2つのテーブルで編集する方法は何ですか? 誰でも自分のコードを修正できますか?

ご清聴ありがとうございました:)

答えて

0

まず、このような問題について質問するときは、常にテーブル構造ではなくエンティティクラスを投稿してください。あなたのコード内で起こっていることと必ずしも同じではないので、あなたのテーブル構造は無関係です。

つまり、問題はModelStateのようなものです。 MVCは、ModelStateというオブジェクトを、さまざまなソース、すなわちModel,RequestおよびViewData/ViewBagからのデータで構成します。 MVCはModelStateオブジェクトを使用してフォームフィールドの値をレンダリングし、検証などを処理します。つまり、ViewBagの値は、ポストボディとモデルインスタンス自体の値を上書きできます。

結果として、ViewBagに入力したものは、モデル上のものと同様に名前を付けてはいけません。そうしないと、奇妙な動作に終わります。この例では、選択リストをViewBag.Idに設定しているため、この選択リストはモデルのIdプロパティの値として使用されますが、これは明らかに正しくありません。 ViewBag.BagChoicesのようなユニークな名前に変更してください。

最後に投稿に直接エンティティクラスを使用し、Bindを使用してプロパティを投稿することは非常に悪い考えです。まず、Bindにはプロパティ名を文字列として渡す必要があります。これは、保守する必要があることを意味しています。プロパティを追加または削除したり、プロパティの名前を変更したりすると、突然フォームが正しく動作しなくなるか、またはセキュリティホールが開かれます。ただし、すべての使用方法を変更しない限り、Bindも同様です。あなたがサスペンスを救いましょう:それをすることを忘れてしまいます。

エンティティインスタンスに似ていると感じても、実際にはポストバック時には通常の古いクラスインスタンスなので、エンティティに直接ポストすると、大きな混乱の元になることがよくあります。 Entity Frameworkで何が起こっているのかはまったく関係がありません。あなたが正しく処理しない限り、Entity Frameworkからの他の実際のエンティティとのやりとりを試みることから実行時の例外が発生することがよくあります。もう一度、あなたにサスペンスを救うことを許してください。あなたは時々それを混乱させます。

変更するエンティティのプロパティのみを含むビューモデルを使用する方がよいでしょう。次に、このビューモデルとの間でエンティティをマッピングします。すべてが強く型付けされているので、これはより安全ですが、ユーザーが提供するデータを決してデータベースに直接書き込まないなどのベストプラクティスに従わなければなりません。また、選択リストを保持するプロパティなど、データベースに保持する必要のあるプロパティとは関係のない追加のプロパティを追加することもできます。エンティティは、永続性に適用されるビジネスルールにのみ関係する必要があります。ビューモデルを使用すると、永続性を妨げたり、気にすることなく、ビューに関するビジネスルールを適用できます。

+0

まず ...あなたの優れた応答をありがとう、私は急いで、問題を投稿して、と私はそのためのmodel..sorryについてのスクリーンショットはなかった。.. あなたは「 私に言ったことに基づいて、変更したいエンティティのプロパティのみを含むビューモデルを使用する方が良いです.. " 私はそれについての例やリファレンスを教えていただけますか?私はまだMVCを学んでいるので、googleで検索し、alliteboo *からmvcに関する電子ブックを読んでいますが、1対1の関係の例は見つけられませんでした。私はCRUD関数を作成する方法について、 最後に、私はあなたに感謝します。 – redburn

0

POSTメソッドのためにあなたのActionResult編集上の二回ViewBag.Idを割り当てました。

ViewBag.Id = new SelectList(db.Bag, "Id", "Brand", Student.Bag.Id); 
ViewBag.Id = new SelectList(db.Students, "Id", "Nama", Student.Id); 

投稿が失敗した後に表示されると、問題が発生することがあります。学生のためのあなたのEdit.cshtmlで

@Html.DropDownListFor(m => m.brand, (SelectList)ViewBag.Id) 

ブランドがあなたの学生に割り当てられていることを確認します。

私は、Studentモデルには、int型のBrandという名前のプロパティ、またはStudent.Idのタイプが何であるかを仮定しています。

+0

私はそれがうまくいくかどうか分からないので、私はViewBag、Idを二度割り当てました。新しいプロジェクト/ソリューションを再作成してもよろしいですか?最初からやり直してください。あなたの助けをありがとう:)後半の応答を – redburn

0

モデルを介してページにデータを転送します。たとえば、あなたはビューに学生を渡す

return View(Student); 

モデルのクラスを作成し、学生を追加し、リストを追加。 ViewBag必ずしも良いとは限りません。たとえば、次のように

public class MyModel 
{ 
    public Student Student { get; set; } 
    public SelectList BagList { get; set; } 
    public SelectList StudentsList { get; set; } 
} 

ビューにデータを渡す:

var model = new MyModel(); 
model.BagList = new SelectList(db.Bag, "Id", "Brand", Student.Bag.Id); 
model.StudentsList = new SelectList(db.Students, "Id", "Nama", Student.Id); 
model.Student = Student;  
return View(model); 

そして、あなたのビューアドオン上:

@model /*your namespace*/MyModel 

そしてビューを使用しているすべてのメソッドを変更。また、ViewBag.Idを2度割り当てました。私の英語には申し訳ありません。

+0

申し訳ありませんが ...一対一の関係で2つのテーブルを使用してMVCでCRUD機能/更新機能を作り、私はこれをしようとします... は、それが動作を期待.. ありがとうあなたの助けと注意のために。 – redburn

+0

@redburn、あなたの歓迎。私は* ViewBag *を使用しないようにし、モデルを通してデータを送信します。 –

関連する問題