2017-01-14 6 views
0

私はSQL Serverに2つのテーブル、テーブル1テーブル2を持ち、以下のレコードを持っています。私の目的はに表示更新両方のテーブルのレコードをMVCの単一のビューに表示します。MVSで親子モデルを使用する場合、CS1061とHtml.BeginFormを使用

enter image description here

私は2つのクラス、TABLE1table2のを持っています。私はまた1つを持っていますクラス、両テーブル。 BothTables親クラスには、子クラスtable1とtable2が含まれています。私は、単一のビューからTABLE1および表2の両方からのレコードを表示することができる

MODEL

namespace www.example.com.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 BothTables 
    { 
     public IEnumerable<table1> TableOne{ get; set; } 
     public IEnumerable<table2> TableTwo{ get; set; } 
    } 

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

CONTROLLER

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

     public ActionResult Details(int id) 
     { 
      using (var db = new example_db()) 
      { 
       var model = new BothTables() 
       { 
        TableOne = db.table1.Where(x => x.id.Equals(id)).ToList(), 
        TableTwo = db.table2.Where(x => x.id.Equals(id)).ToList() 
       }; 
       return View(model); 
      } 
     } 
    } 
} 

VIEW

@model www.example.com.Models.BothTables 

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

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

これは良いです。表1のfooと表2のバーが一度に表示されます。

enter image description here

私は、単一のビューからtable2のにレコードを挿入しますHtml.BeingFormを作成する方法を見つけ出すことはほぼ2週間のために今苦労しています。私は無数の記事を読んで、多くのYouTubeの動画を見てきました。私はこの解決策を見つけることができません。

これを私のコントローラに追加しました。

CONTROLLER

 [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Details(table2 TableTwo) 
     { 
      if (ModelState.IsValid) 
      { 
      db.table2.Add(TableTwo); 
      db.SaveChanges(); 
      } 
      BothTables BothTables = new BothTables(); 
      return View(BothTables); 
     } 

私は表示するには、以下を追加しました。

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.TableTwo.id) 
} 

私はwww.example.com/Content/Details/1に移動し、次のエラーが9行が強調表示し、表示されます赤:

CS1061 'IEnumerableをtable2の' 定義が含まれていません'id'と 'IEnumerable table2'型の最初の引数を受け入れる拡張メソッド 'id'はありませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)

Line 7:@using(Html.BeingForm ())

行8:{

行9:@ Html.EditorFor(x => x.TableTwo。ID)

10行目:}

+0

'BothTables'に 'Id'プロパティがありません – AmirhosseinYari

答えて

2

あなたはtable2にレコードを挿入することができるようにしたい場合は、この目的のために、あなたのビューモデルを調整することができます:

取り込むことができ
public class Table2ViewModel 
{ 
    [Required] 
    public string Column1 { get; set; } 
} 

public class BothTables 
{ 
    public int Id { get; set; } 

    public IEnumerable<table1> TableOne { get; set; } 
    public IEnumerable<table2> TableTwo { get; set; } 

    public Table2ViewModel Table2 { get; set; } 
} 

public ActionResult Details(int id) 
{ 
    using (var db = new example_db()) 
    { 
     var model = new BothTables() 
     { 
      Id = id, 
      TableOne = db.table1.Where(x => x.id.Equals(id)).ToList(), 
      TableTwo = db.table2.Where(x => x.id.Equals(id)).ToList(), 
      Table2 = new Table2ViewModel(), 
     }; 

     return View(model); 
    } 
} 

、その後、あなたのビューで:

012あなたGETアクションで
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Table2) 
    <input type="submit">Insert</input> 
} 

、最終的にあなたのPOSTアクション:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Details(BothTables viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     // some required fields were not populated => we need to 
     // redisplay the view so that the user can fix the errors 
     // Don't forget to populate the 2 fields: 
     using (var db = new example_db()) 
     { 
      viewModel.TableOne = db.table1.Where(x => x.id == viewModel.Id).ToList(), 
      viewModel.TableTwo = db.table2.Where(x => x.id == viewModel.Id).ToList(), 
     } 

     return View(viewModel); 
    } 

    // At this stage we know that the model is valid 
    // and we can save it to the database 

    var entity = new table2(); 
    var entity.column1 = viewModel.Table2.Column1; 
    db.table2.Add(entity); 
    db.SaveChanges(); 

    // Redirect back to the original GET /Content/Details/1 action 
    // (Redirect-After-Post pattern) 
    return RedirectToAction("Details", new { id = viewModel.Id }); 
} 
0

'IEnumerableを表2には、'「IEnumerableを 'ID' とタイプの最初の引数を受け入れていない 拡張メソッド 'ID' の定義が含まれていません。正しいです table2' の(あなたがusingディレクティブまたは アセンブリ参照が不足している?)見つけることができる

IEnumerable<table2>はシーケンスであるため、idの定義は含まれていないためです。あなたが望むのは、そのシーケンスからの単一のアイテムです。だから、おそらくあなたのビューでモデル宣言を変更し、おそらくその目的のために別のビューモデルを作成し、代わりに使用する必要があります。

関連する問題