2016-06-29 15 views
-1

請求書のビューを1つ作成する必要があります。私は多くのモデル(テーブル)を持っており、複数のモデルからのすべてのデータを請求書の一視点で表示したいと考えています。空の(モデルなしの)ビューを1つ作成し、部分的なビューを作成しました。部分図の一つは、一つのモデルと1つのビューを返しますが、このソリューションは私に例外を返す...これが私の仕事です:複数のモデルを単一のビューで表示

@model IEnumerable<Invoice_v1._0.Models.Products> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Price) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Amount) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Price) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Amount) 
     </td> 
    </tr> 
} 

</table> 

public ActionResult Customer() 
     { 
      var data = db.Customer; 

      return PartialView("Index", data); 
     } 

     public ActionResult Invoice() 
     { 
      var data = db.Invoice; 

      return PartialView("Index", data); 
     } 

     public ActionResult Dealer() 
     { 
      var data = db.Dealer; 

      return PartialView("Index", data); 
     } 

     public ActionResult Paid() 
     { 
      var data = dane.Paid; 

      return PartialView("Index", data); 
     } 

     public ActionResult Products() 
     { 
      var data = dane.Products; 

      return PartialView("Index", data); 
     } 

これは、部分図の一つである: これは、コントローラの私の行動であります

これは、一部の景色を望む私の「インデックス」の図である。

@Html.Partial("_Customer") 
@Html.Partial("_Invoice") 
@Html.Partial("_Dealer") 
@Html.Partial("_Paid") 
@Html.Partial("_Products") 

は、私はそれらを解決することができますか?その上

if (Model != null && Model is Customer) 
    Html.Partial("_Customer", Model as Customer) 

、および:

+1

何が例外ですか? –

+0

'@ Html.Action()'を使用すると、データを含む部分的なビューを返すコントローラメソッドを呼び出せますか? (または、すべてのデータが入っているビューモデルを使用してください) –

+0

ビューに異なる「テーブル」があるという理由だけで、部分ビューを使用する必要はありません。慣用的なやり方は、ビューに必要な_all_のデータを組み込んだViewModelを作成し、これをビューの「モデル」として使用することです。部分ビューは、異なる親ビューの中に入ることができる_reusable_ビューのためにより多くあります。 –

答えて

2

あなたは、単一のビューを持つことを主張した場合は、条件付きのパーシャルビューのレンダリングを行うことができます。

関連するすべてのモデルは排他的です(複数のオブジェクトを持つことはありません)ので、1つのインデックスビューを持つ点はありません。クラスごとに1つの(部分的な)ビューを既に持っているので、なぜそれらを通常のビューとして使用しないのですか?

更新

あなたはアクションメソッドのそれぞれから別のビューを返すために選択した場合は、各ビューの名前を指定することによって、それを行うことができます。詳細については、この質問を参照してください:あなたの特定のケースでHow to return ActionResult with specific View (not the controller name)

、それは意味します:

public ActionResult Customer() 
{ 
    return View("_Customer", db.Customer); 
} 

public ActionResult Invoice() 
{ 
    return View("_Invoice", db.Invoice); 
} 

public ActionResult Dealer() 
{ 
    return View("_Dealer", db.Dealer); 
} 

public ActionResult Paid() 
{ 
    return View("_Paid", db.Paid); 
} 

public ActionResult Products() 
{ 
    return View("_Products", db.Products); 
} 

のビューのそれぞれが、強く型付けされたモデルを期待していることを確認してください。これにより、ビューの実装が容易になります。

+0

部分ビューの代わりに通常ビューを作成する必要がありますか?しかし、これを1つのビュー(1ページ)にどのように表示できますか? – kenzolek

+0

私は答えに更新を加えました。 –

+0

私はあなたのソリューションを使用していますが、私の "NullReferenceExcetion"は、_Productsの部分ビューのforeachループのModelで返されます。なぜあなたはアイデアを持っていますか? – kenzolek

0

あなたのアプローチがうまくいくかもしれませんが、(親データの結合や使用を想定したい場合は)データに対する制御がほとんどまたはまったくありません。このような状況では、複数のオブジェクトがその一部として含まれるViewModelを作成します。たとえば、

public class InvoiceViewModel 
{ 
    public InvoiceHead Header { get;set; } 
    public IList<InvoiceDetail> Details { get; set; } 
} 

これで、このビューモデルを作成してからビューに入ることができます。

public ActionResult Invoice(int id) 
{ 
    InvoiceViewModel viewModel = new InvoiceViewModel(); 
    viewModel.Header = db.InvoiceHead.SingleOrDefault(i => i.ID == id); 
    if(viewModel.Header != null) 
    { 
     viewModel.Details = db.Details.Where(d => d.Inv_id == id).ToList(); 
    } 
    return View(viewModel); 
} 

ここで、請求書データの部分ビューまたは全体ビューのいずれかを使用してビューをデザインすることができます。

私はモデルとして置くのIEnumerableやIListの

両方それがされるために、私は部分的に使用している場合 @model db.Objects.InvoiceHead //のヘッダのIEnumerable @model

//用htmlコードで詳細

0

は、独自のフォルダパスを使用すること

@Html.Partial("~/Views/Customers/_AttachFileList.cshtml") 

のようになります。希望が働く

関連する問題