Asp.net mvc 如何填充mvc razor局部视图

Asp.net mvc 如何填充mvc razor局部视图,asp.net-mvc,razor,Asp.net Mvc,Razor,我需要创建一个显示订单标题信息的视图,并需要添加一个显示行项目网格的空间视图。局部视图将是来自viewmodel的强类型视图。我知道我应该使用html helper@html.Partial(“路径/视图”)。到目前为止,我只使用控制器打开视图,在将其发送到视图之前填充viewmodel。由于部分视图是从html助手中调用的,我想知道用模型数据填充部分视图的最佳方法是什么 对于局部视图,您只需发送一个模型,就像对于普通视图一样。例如,如果您的模型具有名为“LineItems”的LineItem对

我需要创建一个显示订单标题信息的视图,并需要添加一个显示行项目网格的空间视图。局部视图将是来自viewmodel的强类型视图。我知道我应该使用html helper@html.Partial(“路径/视图”)。到目前为止,我只使用控制器打开视图,在将其发送到视图之前填充viewmodel。由于部分视图是从html助手中调用的,我想知道用模型数据填充部分视图的最佳方法是什么

对于局部视图,您只需发送一个模型,就像对于普通视图一样。例如,如果您的模型具有名为“LineItems”的LineItem对象属性,则只需执行以下操作:

@Html.Partial("_PartialName", Model.LineItems)
现在,如果您的模型没有该属性,您可以添加它,或者以另一种方式传递它,如ViewBag(我更喜欢强类型方法,但这是我的选择:

@Html.Partial("_PartialName", (List<LineItem>)ViewBag.LineItems)
@Html.Partial(“\u PartialName”,(列表)ViewBag.LineItems)

这些不是唯一的方法,但它们是我首选的方法。

选项1:从父页面继承

默认情况下,通过调用
@Html.partial(“PartialViewName”)
呈现的任何局部视图都将获得传递给父视图的视图模型

因此,如果你有:

视图模型

选项2:指定型号

您可以使用第二个参数指定要传递的视图模型

OrderInfo.cshtml

控制器

公共类OrderController:控制器
{
公共操作结果OrderInfo(int orderId)
{
OrderInfoViewModel viewModel=GetViewModel(orderId);
返回视图(viewModel);
}
公共PartialViewResult OrderLineItems(int orderId)
{
IEnumerable orderItems=GetOrderItems(orderId);
返回部分(订单项);
}
}
OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel
@Model.OrderTitle
@Html.Action(“OrderLineItems”)
OrderLineItems.cshtml

@model IEnumerable
foreach(Model.OrderItems中的var orderItem)
{
//做事
}

在什么情况下,选项3比选项2更可取?我能不能反复调用部分视图并保持干燥?使用选项1和2,您必须使用部分视图所需的所有数据填充主页视图模型。此问题/答案中的场景不是最好的,所以假设您有一个购物车摘要wid获取显示在多个页面上的内容…使用选项3会更容易。否则,也会显示购物车小部件的每个操作(大多数页面)将负责使用购物车小部件所需的数据填充其视图模型。现在我意识到,您必须不断地间接而不是直接地将模型导入局部视图。我认为选项3与我的情况类似。我将对所有订单使用相同的标题,但三个dif中的一个除外不同的行项目局部视图取决于订单在流程中的位置。动态分配局部视图的最佳位置似乎是在控制器中。
namespace MyNamesapce
{
    public OrderInfoViewModel
    {
        public string OrderTitle { get; set; }
        public IEnumerable<OrderItem> OrderItems { get; set; }
    }
}
@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Partial("OrderLineItems")
@model MyNamespace.OrderInfoViewModel

foreach (var orderItem in Model.OrderItems)
{
    //Do stuff
}
@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Partial("OrderLineItems", Model.OrderItems)
@model IEnumerable<OrderItem>

foreach (var orderItem in Model)
{
    //Do stuff
}
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);
    }
}
@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Action("OrderLineItems")
@model IEnumerable<OrderItem>

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