Ответ 1
Вариант 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
}