我的问题在于如何从管道元素返回视图.在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
这样,您可以让控制器执行控制器最佳操作,并为控制器创建一个合约,以便使用新管道进行一般解释.这是实现这一目标的正确方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。