来自非控制器类的ActionResult

本文关键字:ActionResult 控制器 | 更新日期: 2023-09-27 18:27:19

我决定我的控制器有点乱,并决定采用WebAPI项目中使用的管道式系统。管道由越来越通用的操作组成,即:ViewAccountDetailsAction>AccountAction>AuthenticatedAction>EmptyAction。Actions都按照继承的顺序添加到pipleline中,并为不同的场景公开成员或抽象方法。

我的问题在于如何从管道元素返回视图。在WebAPI示例中,返回一个IHttpActionResult非常简单,它不必执行任何视图渲染,但是,MVC需要以不同的方式渲染其响应,并添加Razor步骤。

由于Controllers公开了internal protected辅助方法,如View()RedirectToAction,我不能在控制器本身之外使用这些方法。

有没有一种优雅的方式来渲染这些?我见过几种方法可以做到这一点,每种方法要么繁琐,要么让我感到不舒服。

目前我最喜欢的方法是创建一个internal基类来隐藏受保护的方法,并在调用基类的同时将它们设置为内部方法。控制器实例随后将被提供给实例化的动作。这有什么过分的错误吗?我想不出有什么可虐待的案件,但我想看看社区是否对此事达成了共识。

来自非控制器类的ActionResult

我建议您的方法更进一步。

这需要一些研究,但我基于我为一个使用Web API 2的客户端所做的方法。基本上,我们的想法是创建了一个自定义的ControllerSelector、ActionSelector和ActionDescriptors,以及一个公开强类型业务层的控制器基类。然后,通过反射/自定义属性,我们整理了对业务层的调用,一般处理对HttpResponseResponse消息的转换,包括错误。

  1. 控制器:http://pastebin.com/iK8ieBKD
  2. 控制器选择器:http://pastebin.com/qvEbggrP
  3. 操作选择器:http://pastebin.com/CEFNeKZZ

您需要做的第一件事是查看:http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html

遗憾的是,ASP.NET MVC5的管道远不如Web API 2的管道灵活。但是你可以做三件事:

  1. 自定义控制器工厂:https://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory(v=vs.118).aspx
  2. 自定义控制器描述符
  3. 解释ControllerDescriptor的自定义ActionInvoker:https://msdn.microsoft.com/en-us/library/system.web.mvc.iactioninvoker(v=vs.118).aspx

通过这种方式,您可以让控制器做控制器最擅长的事情,并为控制器创建一个合同,以便使用新的管道进行一般性解释。这确实是正确的做法。

正如你所建议的那样,对控制器进行高顶升/降低成本我认为这不是一个好计划,这是一个更稳健的解决方案,但这需要付出巨大的努力。祝你好运!