Asp.net mvc ASP.NET MVC中的用户控件

Asp.net mvc ASP.NET MVC中的用户控件,asp.net-mvc,user-controls,partial-views,Asp.net Mvc,User Controls,Partial Views,我很喜欢MVC,但我看不懂你是如何实现用户控件的。如果我有多个视图,每个视图都有购物篮详细信息,我如何才能重新填充购物篮视图和代码,这样我就不必使用每个控制器的viewdata返回购物篮数据?来自MSDN页面: 局部视图使您能够定义将在父视图中渲染的视图。部分视图作为ASP.NET用户控件(.ascx)实现 在局部视图中写出您的购物车视图。在ViewPage中,您可以调用Html.RenderPartial(“PartialNameHere”)将其呈现到页面上您从中调用它的任何位置。与视图一样,

我很喜欢MVC,但我看不懂你是如何实现用户控件的。如果我有多个视图,每个视图都有购物篮详细信息,我如何才能重新填充购物篮视图和代码,这样我就不必使用每个控制器的viewdata返回购物篮数据?

来自MSDN页面:

局部视图使您能够定义将在父视图中渲染的视图。部分视图作为ASP.NET用户控件(.ascx)实现

在局部视图中写出您的购物车视图。在ViewPage中,您可以调用
Html.RenderPartial(“PartialNameHere”)
将其呈现到页面上您从中调用它的任何位置。与视图一样,您可以具有强类型的局部视图,以便可以传入您选择的任何类型的模型

请注意以下内容(也可以从上面的MSDN链接中找到;重点是我的):

实例化局部视图时,它将获取父视图可用的ViewDataDictionary对象的自己的副本。因此,局部视图可以访问父视图的数据。但是,如果局部视图更新了数据,则这些更新仅影响局部视图的ViewData对象。父视图的数据未更改


您必须在每个控制器操作中返回篮数据,这些控制器操作将返回使用篮用户控件的视图。但是这里有避免代码重复的方法。您可以使用自定义ActionFilterAttribute来修饰action方法,该属性将在OnExctionExecuted事件中注入适当的数据,或者您可以在基本控制器初始化方法中将篮数据添加到ViewData字典中,然后使用ViewData[“magic string”]控制访问它或者在HtmlHelper上创建扩展方法以避免使用神奇字符串。

其他答案完全正确,但还有第二个选项。通过AJAX调用专用于局部视图的控制器操作,可以呈现局部视图。这样,您的局部视图只需要处理一个模型,该模型只包含它关心的数据

我不建议过分依赖魔术弦。他们到处都是问题。强类型更可取,这样可以使局部视图更容易实现。我同意。这只是众多选择之一。最好的解决方案是为所有视图模型创建基本模型类,并将用户控件使用的数据放在那里。然后,在ActionFilterAttribute中填充数据后,可以使用Html.RenderPartial(“MyControl”,Model.MyControlModelFromBaseViewModel)将特定数据传递给视图中的用户控件。只是想弄清楚一点:如果我选择在每个控制器操作中传递购物车数据,那么实现这一点的最佳方法是什么?是否从存储购物车数据的基础继承每个视图模型类?是这样的,这似乎是一个非常有限的规则,也许ViewData更适合于此?我认为ViewData可以用于此,但您不应该通过ViewData[]在视图中访问它(因为它很凌乱),而是在HtmlHelper或MvcView类上编写一个扩展方法来获取它。更重要的是在何处使用购物车数据初始化模型-定制ActionFilterAttribute非常方便。我同意从项目架构的角度来看,它是最优雅的解决方案。我曾多次尝试过这种解决方案,但标准问题是“如果用户禁用了ajax/js怎么办?”一些核心功能(如购物篮)将无法实现。第二个缺点是,在另一个ajax请求中获取页面的一部分会减慢页面的加载速度,并影响用户体验——页面看起来响应性较差。如果您有太多的问题(单个调用中的大量数据,或者许多较小的ajax调用),它可能会降低页面速度,但是如果您明智地使用它,它会非常有效。就像生活中的一切一样,适度地使用它。关于ajax/js,已禁用。老实说,这些天我不太担心这件事。这在大约5年前肯定是个问题,但我没有遇到过客户端禁用js的问题。这并不意味着它不存在,但它肯定不像以前那么普遍了。不使用ajax调用的主要原因是为了seo而不运行js