2012-12-07 10 views
21

注文ヘッダ情報を表示するビューを作成する必要があります。ラインアイテムのグリッドを表示するpatialビューを追加する必要があります。部分的なビューは、ビューモデルから強く型付けされる。私はhtmlヘルパー@ Html.Partial( "Path/view")を使うべきであることを理解しています。私はコントローラを使ってビューを開くだけで、ビューモデルをビューに送信する前にポピュレートしていました。部分ビューはhtmlヘルパーのフォームと呼ばれているので、モデルデータで傍観ビューを設定する最も良い方法は何かを知りたいと思います。mvc razor partial viewを作成する方法

答えて

40

オプション1:親ページから継承します

デフォルトでは、@Html.Partial("PartialViewName")を呼び出してレンダリングされた部分図は、親ビューに渡されたビューモデルを取得します。

あなたが持っている場合:

ビューモデル

namespace MyNamesapce 
{ 
    public OrderInfoViewModel 
    { 
     public string OrderTitle { get; set; } 
     public IEnumerable<OrderItem> OrderItems { get; set; } 
    } 
} 

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Partial("OrderLineItems") 

OrderLineItemsページはそう...それに渡されたMyNamespace.OrderViewModelを取得する必要があります部分ビューは次のようになります:

OrderLineItems.cshtml

@model MyNamespace.OrderInfoViewModel 

foreach (var orderItem in Model.OrderItems) 
{ 
    //Do stuff 
} 

オプション2:あなたが渡されるビューモデルを指定するには、二番目のパラメータを使用することができるモデル

を指定します。私。

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Partial("OrderLineItems", Model.OrderItems) 

OrderLineItems.cshtml

@model IEnumerable<OrderItem> 

foreach (var orderItem in Model) 
{ 
    //Do stuff 
} 

オプション3:使用して部分的行動

あなたが複数にわたる部分図を再利用する必要がある場合ページ、それは良いかもしれないページが同じ部分的なものを使用しているという理由だけで、異なるビューモデルに同じ情報を設定する必要をなくすために、部分的なビューを使用するアイデア。

など。

ビューモデル

namespace MyNamesapce 
{ 
    public OrderInfoViewModel 
    { 
     public string OrderTitle { get; set; } 
    } 
} 

コントローラ

public class OrderController : Controller 
{ 
    public ActionResult OrderInfo(int orderId) 
    { 
     OrderInfoViewModel viewModel = GetViewModel(orderId); 
     return View(viewModel); 
    } 

    public PartialViewResult OrderLineItems(int orderId) 
    { 
     IEnumerable<OrderItem> orderItems = GetOrderItems(orderId); 
     return Partial(orderItems); 
    } 
} 

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Action("OrderLineItems") 

OrderLineItems.cshtml

@model IEnumerable<OrderItem> 

foreach (var orderItem in Model.OrderItems) 
{ 
    //Do stuff 
} 
+0

オプション3は2よりも優先されるだろうシナリオは何ですか?私はちょうど部分的なビューを繰り返し呼び出すことはできませんでしたが、まだドライですか? – NickSuperb

+0

オプション1と2を使用して、メインビューモデルに部分ビューに必要なすべてのデータを入力する必要があります。この質問/回答のシナリオは最善ではないので、多数のページに表示されるショッピングカートの要約ウィジェットがあるとしましょう...オプション#3を使用する方が簡単です。それ以外の場合は、ショッピングカートウィジェット(ほとんどのページ)も表示されるたびに、ショッピングカートウィジェットに必要なデータが表示されます。 – Charlino

+0

私は、モデルを直接的にではなく間接的にパーシャルビューに連続的に流し込む必要があることを認識しました。 – NickSuperb

4

部分ビューでは、通常のビューと同じようにモデルを送信するだけです。あなたのモデルは、その性質を持っていない場合

@Html.Partial("_PartialName", Model.LineItems) 

さて、あなたはそれを追加するか、またはそれを別の方法を渡すことができ、次のいずれか、あなたのモデルは「LineItemsに」という名前のLineItemオブジェクトのプロパティを持っている場合たとえば、あなたは、単にこれを行うだろう、ViewBagのように(私は強く型付けされた方法を好むが、それは私のopnionです:

@Html.Partial("_PartialName", (List<LineItem>)ViewBag.LineItems) 

これらの唯一の方法ではありませんが、彼らは私の好ましい方法です

関連する問題