【问题标题】:ASP.NET MVC: Access controller instance from viewASP.NET MVC:从视图访问控制器实例
【发布时间】:2010-11-27 21:06:05
【问题描述】:

如何从视图访问控制器实例?例如。我有一个HomeController,然后返回我的Index 视图。在该视图内部,我想访问创建该视图的HomeController 实例。我该怎么做?

【问题讨论】:

标签: c# .net asp.net-mvc


【解决方案1】:

ViewContext.Controller,你需要强制转换它。

<% var homeController = ViewContext.Controller as HomeController; %>

Asp.Net MVC: How do I get virtual url for the current controller/view? 的帖子中有一些额外的皱纹。

编辑:这是为了在 Mark Seemann 的建议中添加一些内容,即尽可能将功能置于视图之外。如果您使用控制器来帮助确定呈现页面的标记,您可能希望使用Html.RenderAction(actionName, controllerName) 方法来代替。此调用将触发该操作,就好像它是一个单独的请求一样,并将其视图作为主页的一部分。

这种方法将有助于强制执行关注点分离,因为重定向到的操作方法可以完成与表示规则相关的所有繁重工作。它需要返回一个局部视图才能在您的父视图中正常工作。

【讨论】:

  • 这就是我想要的。谢谢大卫
  • @David:RenderAction 仅在 Futures 包中可用,对吗?
  • 是的,但是如果您的视图已经可以访问相关模型,您可以改为调用 Html.RenderPartial。另请查看blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc
  • @Alex,这在 Futures 库中可用。很抱歉没有包括那个细节。
  • @Iain,你是对的。我提倡 RenderAction 而不是 RenderPartial 的原因是因为对控制器实例的需求意味着超出视图范围的逻辑处理。 RenderPartial 只是将问题移至不同的视图,而 RenderAction 采用不同的路径(特别是移至另一个操作方法)。
【解决方案2】:

在我看来,你应该考虑一个视图不需要知道控制器的设计。这个想法是控制器处理请求,变出一个模型并将该模型交给视图。至此,Controller 的工作就完成了。

如果 View 需要了解有关 Controller 的任何信息,我认为这表明存在设计缺陷。你能分享更多关于你想要完成的事情吗?

我经常发现,在处理设计良好的框架(例如 MVC 框架)时,如果感觉框架在与您作斗争,那么您可能以错误的方式处理任务。这在我身上发生过很多次,退一步问自己我真正想要完成的是什么往往会带来新的见解。

【讨论】:

  • +1。如果需要实用程序类,它们通常应该进入 ViewModel 或完全独立的实体,因为控制器的生命周期应该以“return”结束。
  • 马克:我在自己的帖子中对你的论点做了一些补充。 +1
  • 我也是+1。我想过这个。我正在做的是我有一个部分视图,类似于 ASP.NET MVC 的常规启动项目中的 LogOnUserControl。它显示一个用户名(但不是来自页面上下文/IPrincipal——它是自定义的)。我的控制器已经有一个能够提供用户名的服务,所以我宁愿从控制器中获取实例,而不是在视图中重新实例化。我没有使用该模型,因为我想利用常规 return View() 而不会遇到问题(请记住,这是共享的,所以我需要一个 VM 基类等
  • @Alex:这听起来像使用名确实属于 ViewModel。您可以使用继承,但您应该优先选择组合而不是继承,因此在这种情况下,我将定义一个“根”ViewModel,其中包含一个 UserName 属性和另一个包含特定于页面的 ViewModel 的属性。然后,您可以在调用 RenderPartial 方法时将 UserName 属性的值作为 model 参数传递。
  • @Alex, Mark:我支持“根”视图模型的论点,它可以随着时间而改变。是的,它现在确实增加了复杂性,但是第二次你需要额外的属性才能进入模型,你必须更新你的视图以匹配。这个 ViewModel 可能会在不同的 View 之间共享,所以这会变得很麻烦。
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多