2017-01-07 6 views
0

SQL Serverに2テーブル、テーブル1およびテーブル2があります。次のMODEL、CONTROLLER、VIEWを使用して、www.example.com/Table/Details/1にtable1とtable2のレコードを表示することができます。MVCで複数のモデルが1つのビューにあるときにレコードをSQL Serverに挿入する方法

MODEL

namespace example.Models 
{  
    public class table1 
    { 
     public int id { get; set; } 
     public string column1{ get; set; } 
    } 

    public class table2 
    { 
     public int id { get; set; } 
     public string column1 { get; set; } 
    } 

    public class tables 
    { 
     public IEnumerable<table1> table1{ get; set; } 
     public IEnumerable<table2> table2{ get; set; } 
    } 

    public class example_db : DbContext 
    { 
     public DbSet<table1> foo { get; set; } 
     public DbSet<table2> bar { get; set; } 
    } 
} 

CONTROLLER

namespace example.com.Controllers 
{ 
    public class ContentController : Controller 
    { 
     private example_db db = new example_db(); 

     //GET: Content/Details/1 
     public ActionResult Details(int id) 
     { 
      using (var db = new example_db()) 
      { 
       var model = new tables() 
       { 
        table1 = db.table1.Where(x => x.id.Equals(id)).ToList(), 
        table2 = db.table2.Where(x => x.id.Equals(id)).ToList() 
       }; 
       return View(model); 
      } 
     } 
    } 
} 

VIEW www.example.com/Content/Details/1で

@model example.Models.tables 

@foreach (var item in Model.table1) 
{ 
    @Html.DisplayFor(x => item.column1) 
} 

@foreach (var item in Model.table2) 
{ 
    @Html.DisplayFor(x => item.column1) 
} 

、TABLE1および表2からのデータが表示されます。この例では、FOOTABLE1であり、かつバーは、table2のです。

enter image description here

私はtable2のにレコードを挿入しますwww.example.com/Content/Details/1にフォームを追加したいです。私はCONTROLLERにこれを追加しました:

// POST: Content/Details/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Details([Bind(Include = "id,column1")] tables tables) 
    { 
     if (ModelState.IsValid) 
     { 
      db.table2.Add(tables); 
      db.SaveChanges(); 
     } 

     return View(tables); 
    } 

Visual Studioでプロジェクトをビルドしようとすると、このエラーが表示されます。CS1503引数1は:WWW」に「www.example.com.Models.tables」から変換することはできません。 example.com.Models.table2'

enter image description here

私はtable2のにレコードを挿入できるように、CONTROLLERを調整する方法がわからないです。

EDIT

私はCONTROLLER(におけるキャピタル・ "T")に次のように試してみました。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Details(Tables tables) 
{ 
    if (ModelState.IsValid) 
    { 
     db.table2.Add(tables.table2); 
     db.SaveChanges(); 
    } 

    return View(tables); 
} 

プロジェクトを構築するとき、私はこのエラーを取得:(CS1061「テーブル」は「table2の」の定義が含まれていないと何の拡張メソッド「表2」タイプの最初の引数を受け入れる「テーブル」は見つかりませんでしたあなたがusingディレクティブまたはアセンブリ参照が不足している?)

enter image description here

を私は私のCONTROLLER テーブル中(小文字の「T」)に次のように試してみました。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Details(tables tables) 
{ 
    if (ModelState.IsValid) 
    { 
     db.table2.Add(tables.table2); 
     db.SaveChanges(); 
    } 

    return View(tables); 
} 

プロジェクトを構築するとき、私はこのエラーを取得:(CS1061「テーブル」は「table2の」の定義が含まれていないと何の拡張メソッド「表2」タイプの最初の引数を受け入れる「テーブル」は見つかりませんでしたあなたがusingディレクティブまたはアセンブリ参照が不足している?)私は表2に私CONTROLLER(キャピタル・「T」で、次の試してみました

enter image description here

)。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Details([Bind(Include = "id,column1")] Table2 table2) 
    { 
     if (ModelState.IsValid) 
     { 
      db.table2.Add(table2); 
      db.SaveChanges(); 
     } 

     return View(tables); 
    } 

プロジェクトを構築するとき、私はこのエラーを取得:「テーブルは」私は(私のCONTROLLERに次のように試してみました

enter image description here

指定されたコンテキストで有効でないタイプであり、小文字の「t」はテーブル2です)。プロジェクトを作成するとき

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Details([Bind(Include = "id,column1")] table2 table2) 
    { 
     if (ModelState.IsValid) 
     { 
      db.table2.Add(table2); 
      db.SaveChanges(); 
     } 

     return View(tables); 
    } 

、私はこのエラーを取得する:CS0246型または名前空間「table2の」が見つかりませんでした(?あなたがusingディレクティブまたはアセンブリ参照が不足している)

enter image description here

+0

あなたはC#の新機能のようです。'db.table1.addRange(tables.table1)'のように 'tables'とは別に各テーブルレコードを追加する必要があります。 –

+0

この度はお勧めします。オリジナルの投稿にEDITを追加しました。 – JeremyCanfield

答えて

2

私が間違っていなければ、 "db.table2.Add(テーブル)"という行にエラーが表示されます。

db.table2は "table2"型のDbSetであるため、 "table2"のオブジェクトのみを追加できます。あなたは "テーブル"クラスのオブジェクトを追加しようとしている間。これはタイプミスマッチの明確なケースです。

正しいコード行は次のようになります。

db.table1.Add(tables.table1); 
db.table2.Add(tables.table2); 
db.SaveChanges(); 

また、次のようにActionメソッドの署名を変更する必要があります。

public ActionResult Details(tables tables) 

Table2のデータのみがUIから送信されることが予想される場合は、Actionメソッドを次のように変更する必要があります。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Details(Bind(Include = "id,column1")] table2 table2) 
{ 
    if (ModelState.IsValid) 
    { 
     db.table2.Add(table2); 
     db.SaveChanges(); 
    } 

    // You need to re-create object to tables class to pass it to the view. 
    return View(tables); 
} 
+0

ありがとうございます。オリジナルの投稿にEDITを追加しました。 – JeremyCanfield

+0

これで動作します。 Chetanありがとうございます。 – JeremyCanfield

0

あなたの更新を見ました。

テーブルクラスには、プロパティtable2がありません。それは同じ名前 "table1"を持つ2つの特性を持っています。

public IEnumerable<table1> table1{ get; set; } 
public IEnumerable<table1> table1{ get; set; } 

コンパイラがそれについてのエラーを表示しなかった理由はわかりません。

テーブルクラスでは、2番目のプロパティを次のように変更する必要があります。

public IEnumerable<table2> table2{ get; set; } 

さて型または名前空間 『テーブル』「が見つかりませんでした」というエラーについて、あなたは私が私の解決策に入れたコメントを確認する必要があります。コメントは、あなたが再する必要が

//ですあなたが持っているので、ビューに渡すために、テーブルクラスに-createオブジェクト。

ですから、ビューに渡すクラス「テーブル」の新しいオブジェクト「表」を作成する必要があります。

あなたのコードも混乱していますクラス、プロパティ、オブジェクトに同じ名前が使用されました 1文字を小文字から大文字に変更しても問題は解決しません。コンパイルエラーの数が増えます。

これらはすべて単純なC#コンパイル時のエラーであり、C#とOOPを正しく理解していれば、その背後にある理由ははっきりしています。

+0

あなたChetan。モデルのクラスを修正しました。文法上の誤りがありました。それは今働いている。助けてくれてありがとう! – JeremyCanfield

関連する問題