关于控制器工厂的扩展,要么通过实现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. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  2. (二) Log4j 配置详解

    第一节: rootLogger 根配置 Log4j 根配置语法 log4j.rootLogger = [ level ] , appenderName, appenderName, … 指代 把指定级 ...

  3. python之路:python基础3

    ---恢复内容开始--- 本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 ...

  4. gtk+学习笔记(四)

    今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...

  5. USACO 4.3 Buy Low, Buy Lower

    Buy Low, Buy Lower The advice to "buy low" is half the formula to success in the stock mar ...

  6. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) E - Aquarium decoration 贪心 + 平衡树

    E - Aquarium decoration 枚举两个人都喜欢的个数,就能得到单个喜欢的个数,然后用平衡树维护前k大的和. #include<bits/stdc++.h> #define ...

  7. PHP phpexcel 导入时间/日期转换时间戳

    strtotime(gmdate('Y-m-d H:i',\PHPExcel_Shared_Date::ExcelToPHP($importtime))); /** * 判断字符串是否是日期格式 * ...

  8. FIFO调度算法和LRU算法

    一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...

  9. CSU训练分类

    √√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...

  10. [ 转载 ] Java基础4--Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...