MVC Razor 部分ビューを設定する方法 質問する

MVC Razor 部分ビューを設定する方法 質問する

注文ヘッダー情報を表示するビューを作成し、明細項目のグリッドを表示する部分ビューを追加する必要があります。部分ビューは、ビューモデルから厳密に型指定されます。HTML ヘルパー @Html.Partial("Path/view") を使用する必要があることは理解しています。これまでは、ビューを開いてビューモデルにデータを入力してからビューに送信するためにコントローラーのみを使用してきました。部分ビューは HTML ヘルパーから呼び出されるため、部分ビューにモデル データを入力する最適な方法を知りたいと思います。

ベストアンサー1

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

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

したがって、次のような場合:

モデルを表示

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

注文情報.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Partial("OrderLineItems")

OrderLineItems ページMyNamespace.OrderViewModelに渡されるはずです...そのため、部分ビューは次のようになります。

注文明細項目.cshtml

@model MyNamespace.OrderInfoViewModel

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

オプション2: モデルを指定する

2番目のパラメータを使用して、渡すビューモデルを指定できます。つまり、

注文情報.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

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

注文明細項目.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);
    }
}

注文情報.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Action("OrderLineItems")

注文明細項目.cshtml

@model IEnumerable<OrderItem>

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

おすすめ記事