我已经决定我的控制器变得有点凌乱,并决定采用我在WebAPI项目中使用的管道式系统.管道由动作组成,这些动作越来越普遍,即:ViewAccountDetailsAction> AccountAction> AuthenticatedAction> EmptyAction. Actions按继承顺序添加到pipleline,并为不同的场景公开成员或抽象方法.
我的问题在于如何从管道元素返回视图.在WebAPI示例中,它就像返回一个不必执行任何视图呈现的IHttpActionResult一样容易,但是,MVC需要以不同的方式呈现其响应,并使用Razor的附加步骤.
由于控制器公开了内部受保护的辅助方法,如View()或RedirectToAction,我不能在控制器本身之外使用它们.
是否有一种优雅的方式来呈现这些?我已经看到了一些方法,每个方法都很麻烦,或者给我带来不舒服的感觉.
目前我最喜欢的方法是创建一个内部基类来隐藏受保护的方法,并将它们设置为内部,同时调用基本方法.然后将控制器实例提供给实例化的动作.这有什么不妥吗?我想不出任何可滥用的案件,但想知道是否有任何社区就此事达成共识.
最佳答案 我建议你的方法更进一步.
这需要一些研究,但我的基础是我为Web API 2客户端所做的一种方法.基本上我们创建了一个自定义的ControllerSelector,ActionSelector和ActionDescriptors以及一个暴露强类型业务层的控制器基类. .然后通过反射/自定义属性,我们编组了对业务层的调用,一般处理HttpResponseResponse消息的转换,包括错误.
>控制器:http://pastebin.com/iK8ieBKD
> ControllerSelector:http://pastebin.com/qvEbggrP
> ActionSelector:http://pastebin.com/CEFNeKZZ
你需要做的第一件事是看:
http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html
不幸的是,ASP.NET MVC5的管道不如Web API 2灵活得多.但是你可以做三件事:
>定制控制器工厂:https://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory(v=vs.118).aspx
>自定义ControllerDescriptor
>自定义ActionInvoker,解释ControllerDescriptor:https://msdn.microsoft.com/en-us/library/system.web.mvc.iactioninvoker(v=vs.118).aspx
这样,您可以让控制器执行控制器最佳操作,并为控制器创建一个合约,以便使用新管道进行一般解释.这是实现这一目标的正确方法.
如您所述,高控制/控制控制器我认为这不是一个很好的计划,这是一个更强大的解决方案,但需要付出很大的努力.祝你好运!