2012-12-07 83 views
21

我需要创建一个显示Order Header信息的视图,我需要添加一个显示行项目网格的空间视图。部分视图将从视图模型中强类型化。我明白我应该使用html助手@ Html.Partial(“Path/view”)。我现在只使用控制器来打开视图,在将视图发送到视图之前填充视图模型。由于部分视图被称为形式的HTML帮助器,我想知道是什么是用模型数据填充组合视图的最佳方式。如何填充mvc剃须刀局部视图

回答

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:使用部分行动

如果您需要重用在多个局部视图页面,它可能是一个很好的想法使用部分视图,以消除必须使用相同的信息填充不同的视图模型,因为该页面将使用相同的部分。

E.g.

视图模型

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

通过局部视图,您只需像使用普通View一样在模型中发送数据。例如,如果你的模型有一个名为LineItem对象的属性“了LineItem”你只是这样做:

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

现在,如果你的模型没有这个属性,你可以添加它,或者通过另一种方式像ViewBag(我更喜欢一个强类型的方法,但这是我的opnion:

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

这些都不是唯一的途径,但他们是我的首选方法

相关问题