我喜欢 MVC,但无法理解您如何实现用户控件。如果我有一个带有购物篮详细信息的多个视图,我如何封装购物篮视图和代码,这样我就不必使用每个控制器视图数据返回购物篮数据?
3 回答
从这个MSDN 页面:
局部视图使您能够定义将在父视图中呈现的视图。部分视图被实现为 ASP.NET 用户控件 (.ascx)。
在局部视图中写出您的购物车视图。在 ViewPage 中,您调用Html.RenderPartial("PartialNameHere")
它以将其呈现到您调用它的页面上的任何位置。与视图一样,您可以拥有强类型的局部视图,以便您可以传入您选择的任何类型的模型。
请注意以下内容(也来自上面的 MSDN 链接;强调我的):
当一个局部视图被实例化时,它会获得它自己的 ViewDataDictionary 对象的副本,该副本可用于父视图。因此,部分视图可以访问父视图的数据。但是,如果局部视图更新数据,这些更新只会影响局部视图的 ViewData 对象。父视图的数据没有改变。
其他答案完全正确,但还有第二种选择。您可以通过 AJAX 调用专用于您的局部视图的控制器操作来呈现局部视图。这样,您的局部视图只需要处理一个模型,该模型只包含它关心的数据。
您必须在将返回使用购物篮用户控件的视图的每个控制器操作中返回购物篮数据。但是这里有一些方法可以避免代码重复。您可以使用自定义 ActionFilterAttribute 装饰操作方法,该属性将在 OnAxctionExecuted 事件中注入适当的数据,或者您可以将篮子数据添加到基本控制器 Initialize 方法中的 ViewData 字典,然后使用 ViewData["magic-string"] 控制访问它或创建HtmlHelper 上的扩展方法以避免魔术字符串。