来自非控制器类

时间:2015-12-18 06:09:03

标签: c# asp.net-mvc asp.net-mvc-4 razor asp.net-mvc-5

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

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

由于控制器公开了internal protectedView()RedirectToAction辅助方法,我无法在控制器本身之外使用这些方法。

有没有一种优雅的方式来呈现这些?我已经看到了几种方法,每种方法都很麻烦,或者给我带来不舒服的感觉。

目前我最喜欢的方法是创建一个internal基类隐藏受保护的方法,并将它们设置为内部,同时调用基本方法。然后将控制器实例提供给实例化的动作。这有什么不妥吗?我无法想到任何可滥用的案件,但想知道是否有任何社区就此事达成共识。

1 个答案:

答案 0 :(得分:1)

我建议您更进一步。

这需要一些研究,但我的基础是我为Web API客户端做的一种方法。基本上我们创建了一个自定义的ControllerSelector,ActionSelector和ActionDescriptors以及一个暴露强大的控制器基类。键入的业务层。然后通过反射/自定义属性,我们编组了对业务层的调用,一般处理HttpResponseResponse消息的转换,包括错误。

  1. 控制器:http://pastebin.com/iK8ieBKD
  2. ControllerSelector:http://pastebin.com/qvEbggrP
  3. ActionSelector:http://pastebin.com/CEFNeKZZ
  4. 您需要做的第一件事就是: 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. 自定义ControllerDescriptor
    3. 解释ControllerDescriptor的自定义ActionInvoker:https://msdn.microsoft.com/en-us/library/system.web.mvc.iactioninvoker(v=vs.118).aspx
    4. 通过这种方式,您可以让控制器执行控制器最佳操作,并为控制器创建一个合约,以便使用新管道进行一般解释。这确实是正确的做法。

      按照您的建议高举起/控制控制器我不认为这是一个很好的计划,这是一个更强大的解决方案,但需要付出很大的努力。祝你好运!