C# ASP.NET MVC:从视图访问控制器实例

C# ASP.NET MVC:从视图访问控制器实例,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,如何从视图访问控制器实例?例如,我有一个家庭控制器,然后返回我的索引视图。在该视图中,我想访问创建该视图的HomeController实例。我该怎么做?ViewContext.Controller,您需要强制转换它 <% var homeController = ViewContext.Controller as HomeController; %> 这是覆盖着一些额外的皱纹后 编辑:这是为了给Mark Seemann的建议添加一些内容,即尽可能将功能排除在视图之外。如果使用控

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

ViewContext.Controller,您需要强制转换它

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

这是覆盖着一些额外的皱纹后

编辑:这是为了给Mark Seemann的建议添加一些内容,即尽可能将功能排除在视图之外。如果使用控制器帮助确定呈现页面的标记,则可能需要使用
Html.RenderAction(actionName,controllerName)
方法。此调用将启动该操作,就像它是一个单独的请求一样,并将其视图作为主页的一部分


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

,在我看来,您应该考虑一个设计,视图不需要知道控制器。其思想是,控制器处理请求,变出一个模型,然后将该模型交给视图。此时,控制器的工作完成

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


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

这就是我一直在寻找的。非常感谢。David@David:RenderAction仅在Futures软件包中可用。是否正确?是的,但如果您的视图已具有对相关模型的访问权限,则可以调用Html.RenderPartial。还可以查看@Alex,这可以在Futures库中找到。很抱歉没有包括那个细节。@Iain,你说得对。我提倡RenderAction而不是RenderPartial的原因是,对控制器实例的需要意味着逻辑处理超出了视图的范围。RenderPartial只是将问题移动到另一个视图,而RenderAction走的是另一条路线(特别是另一个操作方法)。+1。如果需要实用程序类,它们通常应该进入ViewModel或完全独立的实体,因为控制器的生命周期应该以“return”结束+我也是。我考虑过这个。我所做的是,我有一个局部视图,类似于ASP.NET MVC常规初学者项目中的LogOnUserControl。它显示一个用户名(但不是来自页面上下文/IPrincipal——它是自定义的)。我的控制器已经有了一个能够提供用户名的服务,因此我宁愿从控制器获取实例,而不是在视图中重新实例化。我不使用该模型,因为我希望利用常规的return View()而不会遇到问题(记住,这是共享的,所以我需要一个VM基类etc@Alex:这听起来像是使用名称确实属于ViewModel。您可以使用继承,但您更喜欢组合而不是继承,因此在这种情况下,我将定义一个“根”ViewModel,其中包含用户名属性和另一个包含页面规范的属性ific ViewModel。然后,在调用RenderPartial方法时,可以将UserName属性的值作为模型参数传递。@Alex,Mark:我支持“root”的参数ViewModel可以随着时间的推移而改变。是的,它现在确实增加了复杂性,但是第二次你需要额外的属性才能进入模型,你必须更新你的视图以匹配。这个ViewModel可能在不同的视图之间共享,所以这会变得很麻烦。为什么答案不是“你不应该”(c.f.)?