zoukankan      html  css  js  c++  java
  • oXite源码学习导读二:Action的返回类型与IActionInvoker

    我们先来看一下oXite里面一段Controller中Action方法的代码:

    namespace Oxite.Controllers
    {
        public class AreaController : Controller
        {
            [ActionName("Find"), AcceptVerbs(HttpVerbs.Post)]
            public virtual OxiteModelList<Area> FindQuery(AreaSearchCriteria searchCriteria)
            {
                IList<Area> foundAreas = areaService.FindAreas(searchCriteria);
                OxiteModelList<Area> model = new OxiteModelList<Area> { List = foundAreas };
    
                model.AddModelItem(searchCriteria);
    
                return model;
            }

    看出上面的Action方法有什么不妥么?怎么Action方法返回的类型为OxiteModelList<Area>的呢?Controller的Action方法返回的不是ActionResult或者为Void的么?难道Action的返回值还可以是任意类型的?相信你看到Controller里面Action方法这些代码的时候,你也会产生这样的疑问。

    默认情况下Action的返回值应该是ActionResult(推荐)或者void。那么这里为什么可以返回一个数据集合呢?你或许会想OxiteModelList<Area>会不会是继承自ViewResult呢?很遗憾的OxiteModelList<Area>并没是继承自ViewResult。正当我郁闷的时候,忽然看到ContainerFactory里面对IActionInvoker进行了Ioc注册:

    image

    于是很兴奋的跑去OxiteControllerActionInvoker里面看个究竟,果然是在这里做了手脚:

    namespace Oxite.Infrastructure
    {
        public class OxiteControllerActionInvoker : ControllerActionInvoker
        {
            private readonly IFilterRegistry filterRegistry;
    
            public OxiteControllerActionInvoker(IFilterRegistry filterRegistry)
            {
                this.filterRegistry = filterRegistry;
            }
    
            protected override ActionResult CreateActionResult
    (ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue) { if (actionReturnValue == null) { controllerContext.Controller.ViewData.Model = new OxiteModel { Container = new NotFoundPageContainer() }; return new NotFoundResult(); } if (typeof(ActionResult).IsAssignableFrom(actionReturnValue.GetType())) return actionReturnValue as ActionResult; controllerContext.Controller.ViewData.Model = actionReturnValue; return new ViewResult { ViewData = controllerContext.Controller.ViewData, TempData = controllerContext.Controller.TempData }; }

    OxiteControllerActionInvoker的继承关系如下
    OxiteControllerActionInvoker =>> ControllerActionInvoker –>> IActionInvoker 。

    OxiteControllerActionInvoker重写了ControllerActionInvoker的CreateActionResult方法,该方法有一个命名为actionReturnValue的参数,从参数的命名我们很容易就可以看出这个参数的意义,没错她就是我们Action中返回的结果,从上面的代码我们可以看到将actionReturnValue赋值给了ViewData.Model,然后重新构造一个ViewResult的结果返回。相信看完上面的代码你已经豁然开朗了。

    然后在OxiteControllerFactoryController的ActionInvoker修改为OxiteControllerActionInvoker

    namespace Oxite.Infrastructure
    {
        public class OxiteControllerFactory : DefaultControllerFactory
        {
            private readonly IUnityContainer container;
    
            public OxiteControllerFactory(IUnityContainer container)
            {
                this.container = container;
            }
    
            protected override IController GetControllerInstance(Type controllerType)
            {
                IController iController = container.Resolve(controllerType) as IController;
    
                if (typeof(Controller).IsAssignableFrom(controllerType))
                {
                    Controller controller = iController as Controller;
    
                    if (controller != null)
                        controller.ActionInvoker = container.Resolve<IActionInvoker>();
    
                    return iController;
                }
    
                return iController;
            }
        }
    }

    前面已经对IActionInvoker进行了注册:

    image

    Enjoy。By Q.Lee.lulu

  • 相关阅读:
    asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)
    asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4
    asp.net core 支付宝支付( 电脑2.0)
    asp.net core 微信公众号支付(扫码支付,H5支付,公众号支付,app支付)之3
    asp.net core 微信获取用户openid
    asp.net core 微信H5支付(扫码支付,H5支付,公众号支付,app支付)之2
    asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1
    论BOM管理的若干重要问题
    BOM的编制与管理
    设计变更时,零部件的标识是变号还是升版?
  • 原文地址:https://www.cnblogs.com/QLeelulu/p/1425540.html
Copyright © 2011-2022 走看看