我需要创建一个显示Order Header信息的视图,我需要添加一个显示行项目网格的空间视图。部分视图将从视图模型中强类型化。我明白我应该使用html助手@ Html.Partial(“Path/view”)。我现在只使用控制器来打开视图,在将视图发送到视图之前填充视图模型。由于部分视图被称为形式的HTML帮助器,我想知道是什么是用模型数据填充组合视图的最佳方式。如何填充mvc剃须刀局部视图
21
A
回答
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
}
4
通过局部视图,您只需像使用普通View一样在模型中发送数据。例如,如果你的模型有一个名为LineItem对象的属性“了LineItem”你只是这样做:
@Html.Partial("_PartialName", Model.LineItems)
现在,如果你的模型没有这个属性,你可以添加它,或者通过另一种方式像ViewBag(我更喜欢一个强类型的方法,但这是我的opnion:
@Html.Partial("_PartialName", (List<LineItem>)ViewBag.LineItems)
这些都不是唯一的途径,但他们是我的首选方法
相关问题
- 1. Jquery Modal窗口与mvc 3剃须刀局部视图问题
- 2. 局部视图MVC3剃刀
- 3. ASP.NET MVC(剃须刀)部署
- 4. 剃刀视图和局部视图
- 5. 未填充剃须刀自定义视图属性
- 6. MVC剃刀布局 - 从视图
- 7. 如何调试mvc4剃须刀视图?
- 8. 从部分填充剃刀部分
- 9. 在剃须刀上动态添加局部视图
- 10. 剃刀局部视图不渲染
- 11. 返回剃刀局部视图
- 12. 如何在aspx视图页中调用剃刀局部视图
- 13. 部分视图不渲染MVC剃须刀
- 14. MVC部分视图呈现但不执行剃须刀代码
- 15. 在mvc剃须刀中更新两个局部视图的最佳方式
- 16. ASP.Net MVC 3剃须刀,对文件上传局部视图通用方法
- 17. 我可以在剃刀局部视图内的主页面中填充ContentPlaceHolder吗?
- 18. 如何在Asp.Net MVC中确定剃须刀视图中的“IsPartial”?
- 19. 如何在MVC 3剃须刀视图中生成空href
- 20. 如何在asp.net mvc剃须刀视图中嵌入rdl报告?
- 21. asp.net MVC 3剃须刀部署IIS7
- 22. MVC剃刀从子视图
- 23. MVC剃刀jQuery的局部视图渲染
- 24. 分页为MVC中的webGrid.GetHtml剃刀局部视图
- 25. 局部视图进入Asp.net MVC主_layout 4剃刀
- 26. MVC 3与关于局部视图的剃刀问题
- 27. asp.net mvc剃刀局部视图:没有intelisense或颜色
- 28. 如何在asp.net MVC 3剃须刀
- 29. 如何在用户单击后呈现局部视图(使用剃须刀)?
- 30. 如何在Metro/Rt中实现这种剃须刀概念(局部视图)?
什么情况下,选项3将优于2?我不能重复调用局部视图,仍然是干的吗? – NickSuperb
使用选项1和2,必须使用局部视图所需的所有数据填充主页面视图模型。这个问题/答案中的场景不是最好的,所以可以说你有一个购物车摘要小部件,它显示在许多页面上......使用选项#3会更容易。否则,显示购物车小部件(大多数页面)的每一个动作都将负责使用购物车小部件所需的数据填充其视图模型。 – Charlino
正确的,我现在意识到,你将不得不间接地将模型漏入局部视图而不是直接。 – NickSuperb