关于控制器工厂的扩展,要么通过实现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());
        }
 

输入old/index:

输入old/any:

输入new/index:

输入new/any:

输入home/index:

输入any/any:

参考资料:

Controller Factory and Action Invoker Part 1

MVC扩展控制器工厂,通过实现IControllerFactory,根据action名称生成不同的Controller的更多相关文章

  1. MVC扩展控制器工厂,通过继承DefaultControllerFactory来决定使用哪个接口实现,使用Ninject

    希望实现的效果是:对购物车中所有商品的总价,实现9折或8折: 当点击"9折": 当点击"8折": □ 思路 8折或9折是打折接口的不同实现,关键是:由什么条件决 ...

  2. MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串

    原文:MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串 如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制 ...

  3. MVC扩展控制器, 把部分视图转换成字符串(带验证信息), 并以json传递给前端视图

    当我们使用jQuery异步提交表单数据的时候,需要把部分视图转换成字符串(带验证信息),以json的形式传递给前端视图.   使用jQuery异步加载部分视图,返回内容追加到页面某个div:   jQ ...

  4. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  5. 17+个ASP.NET MVC扩展点【附源码】

    1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.  在自定义的Http ...

  6. ASP.NET MVC 创建控制器类过程

    MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...

  7. Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

    标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...

  8. MVC的控制器的激活过程,我们从MvcHandler开始讲,前面的事情以后再讲

    一.从MvcHandler开始(不要觉得是代码,让你看懂才是最重要的) using Microsoft.Web.Infrastructure.DynamicValidationHelper; usin ...

  9. 面向接口可扩展框架之“Mvc扩展框架及DI”

    面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...

随机推荐

  1. matlab转python

    最近在做把matlab代码转成python代码,没有用过matlab,python也只是局限于爬虫,所以.... matlab与python最大的不同是,matlab的下标是从1开始的,python和 ...

  2. python 图片上传写入磁盘功能

    本文是采取django框架,前端上传图片后端接收后写入磁盘,数据库记录图片在磁盘上的路径(相对),以下是前端上传到后端入库的基本流程 一. html代码 <!DOCTYPE html> & ...

  3. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429

  4. mysql 5.1 下载地址 百度云网盘下载

    mysql 百度云下载 链接: https://pan.baidu.com/s/1fPSEcgtDN7aU2oQ_sL08Ww 提取码: 关注公众号[GitHubCN]回复2539获取

  5. 【LOJ】#2056. 「TJOI / HEOI2016」序列

    题解 这个我们处理出来每一位能变化到的最大值和最小值,包括自身 然后我们发现 \(f[i] = max(f[i],f[j] + 1) (mx[j] <= a[i] && a[j] ...

  6. USACO 5.3 Window Area

    Window AreaIV Balkan Olympiad You've just be assigned the project of implemented a windowing interfa ...

  7. PHP学习日记 函数

    可变函数 PHP支持可变函数的概念.所以如果一个变量后面有圆括号“()”,PHP将寻找与变量值同名的函数,并尝试执行此函数,可变函数可以用来实现回调函数.函数列表等.可变函数不能用于echo.prin ...

  8. thinkphp3.2自动生成模块BIND_MODULE

    thinphp3.2中提供了自定义生成模块与控制器的常量,分别是BIND_MODULE,BUILD_CONTROLLER_LIST 在 index.php 文件中定义 BIND_MODULE,BUIL ...

  9. OpenGL 笔记<3> 数据传递 一

    Sending data to a shader using vertex attributes and vertex buffer object 上次我们说到着色器的编译和连接,后面的事情没有做过多 ...

  10. Qt中使用Json

    Qt中使用Json需要一下几个类: QJsonValue            代表了json格式中的一个值 QJsonObject          代表了json格式的一个对象 QJsonArra ...