【问题标题】:Like Html.RenderAction() but without reinstantiating the controller object像 Html.RenderAction() 但没有重新实例化控制器对象
【发布时间】:2009-12-13 13:21:23
【问题描述】:

我喜欢在HtmlHelper 对象上使用RenderAction 扩展方法来呈现页面中的侧边栏等,因为它允许我将每个此类部分的数据访问代码保存在控制器上的单独方法中。使用抽象控制器库,我可以定义一个默认的“侧边栏策略”,然后可以在需要时通过覆盖具体控制器中的方法来改进它。

我使用这种方法的唯一“问题”是,RenderAction 的构建方式总是创建控制器类的新闻实例,即使在呈现来自控制器的动作时也是如此。我的一些控制器在他们的Initialize 方法中进行了一些数据查找,并且在视图中使用RenderAction 方法会导致这种情况在同一个请求中发生多次。

如果要调用的操作方法与“父”操作在同一个控制器类上,是否有其他 RenderAction 的替代方法可以重用控制器对象?

【问题讨论】:

  • 为什么这对您来说是个问题?不做过早优化吗?
  • @queen3: 可能,但这不是问题:)

标签: asp.net-mvc renderaction


【解决方案1】:

您可以在控制器中调用 this.[ActionName]。

例如,主控制器的 About 操作方法中的 this.Index() 将导致 Index 视图被渲染,而无需再次通过控制器初始化。不过,这仅适用于整个页面。

renderPartial 可以为您工作,但您必须确保“元素”(侧边栏等)在父视图模型中具有所需的所有数据。

例如 RenderPartial("SideBars", ViewData.Model)。如果您的 ViewModel 包含您需要的部分内容,则可以将它们添加到共享视图的顶部,并且您的控制器只需要设置初始 ViewMoel。

善良,

【讨论】:

  • 使用RenderPartial(),视图明确指出要在我的侧边栏中包含哪个部分视图,并且控制器必须预先提供此部分的数据。使用RenderAction(),控制器可以决定侧边栏的内容,并且可以推迟侧边栏所需的任何数据访问,直到做出此决定。两种方法都有用例,但对于我想做的事情,我相信RenderAction() 是最合适的。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多