标签:style c class blog code tar
关于控制器工厂的扩展,要么通过实现IControllerFactory接口,要么通过继承DefaultControllerFactory。本篇中,我想体验的是:
1、当请求经过路由,controller, action名称是以key/value键值对形式存放的,我们可以通过RequestContext.RouteData.Values["action"]和RequestContext.RouteData.Values["controller"]获取action或controller的名称。
2、通过实现IControllerFactory接口,根据请求中的controller名称,来返回不同类型的IController。
3、另外,当请求到了某个Controller, 通过实现IController接口,根据从路由中拿到的action名称,可以自定义响应。
□ HomeController:
        public ActionResult Index()        {return Content("我来自NewProduct/Index");
}
□ NewProductController:
using System.Web.Mvc;namespace MvcApplication1.Controllers{public class NewProductController : Controller
    {        public ActionResult Index()        {return Content("我来自NewProduct/Index");
}
}
}
□ OldProductController:
通过实现IController接口,根据从路由中拿到的action名称,实现自定义响应。
using System.Web.Mvc;namespace MvcApplication1.Controllers{public class OldProductController : IController
    {public void Execute(System.Web.Routing.RequestContext requestContext)
        {            //action名称是以key/value保存的string actionName = requestContext.RouteData.Values["action"].ToString().ToLower();
            switch (actionName)            {case "index":
                    requestContext.HttpContext.Response.Write("我来自OldProduct/Index");                    break;                default:                    requestContext.HttpContext.Response.Write("我来自OleProduct/" + actionName);                    break;}
}
}
}
□ MyControllerFactory
实现IControllerFactory接口,当controller名称是new的时候,返回NewProductController;当controller名称是old,返回OldProductController;默认情况下返回Home/Index。
using System;using System.Web.Mvc;using System.Web.SessionState;using MvcApplication1.Controllers;namespace MvcApplication1.Extension{public class MyControllerFactory : IControllerFactory
    {public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        {            Type controllerType = null;            switch (controllerName)            {case "new":
                    controllerType = typeof (NewProductController);                    break;case "old":
                    controllerType = typeof (OldProductController);                    break;                default:                    controllerType = typeof (HomeController);requestContext.RouteData.Values["controller"] = "Home";
requestContext.RouteData.Values["action"] = "index";
                    break;}
return controllerType == null ? null : (IController) DependencyResolver.Current.GetService(controllerType);
}
public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
        {            return SessionStateBehavior.Default;}
public void ReleaseController(IController controller)
        {            IDisposable disposable = controller as IDisposable;if (disposable != null)
            {disposable.Dispose();
}
}
}
}
全局注册自定义控制器工厂。
protected void Application_Start()
        {......
            ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());}
参考资料:
Controller Factory and Action Invoker Part 1
MVC扩展控制器工厂,通过实现IControllerFactory,布布扣,bubuko.com
MVC扩展控制器工厂,通过实现IControllerFactory
标签:style c class blog code tar
原文地址:http://www.cnblogs.com/darrenji/p/3752545.html