您的位置:首页 > 其它

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

2014-05-26 10:30 525 查看
关于控制器工厂的扩展,要么通过实现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:

publicActionResultIndex()

[code]{
returnContent("我来自NewProduct/Index");

}

[/code]

□NewProductController:

usingSystem.Web.Mvc;

[code]
namespaceMvcApplication1.Controllers

{

publicclassNewProductController:Controller

{
publicActionResultIndex()

{

returnContent("我来自NewProduct/Index");

}


}

}

[/code]

□OldProductController:

通过实现IController接口,根据从路由中拿到的action名称,实现自定义响应。

usingSystem.Web.Mvc;

[code]
namespaceMvcApplication1.Controllers

{

publicclassOldProductController:IController

{

publicvoidExecute(System.Web.Routing.RequestContextrequestContext)

{

//action名称是以key/value保存的

stringactionName=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;

}

}

}

}


[/code]

□MyControllerFactory

实现IControllerFactory接口,当controller名称是new的时候,返回NewProductController;当controller名称是old,返回OldProductController;默认情况下返回Home/Index。


usingSystem;

[code]usingSystem.Web.Mvc;
usingSystem.Web.SessionState;

usingMvcApplication1.Controllers;


namespaceMvcApplication1.Extension

{

publicclassMyControllerFactory:IControllerFactory

{

publicIControllerCreateController(System.Web.Routing.RequestContextrequestContext,stringcontrollerName)

{

TypecontrollerType=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;

}

returncontrollerType==null?null:(IController)DependencyResolver.Current.GetService(controllerType);

}


publicSystem.Web.SessionState.SessionStateBehaviorGetControllerSessionBehavior(System.Web.Routing.RequestContextrequestContext,stringcontrollerName)

{

returnSessionStateBehavior.Default;

}


publicvoidReleaseController(IControllercontroller)

{

IDisposabledisposable=controllerasIDisposable;

if(disposable!=null)

{

disposable.Dispose();

}

}

}

}


[/code]

全局注册自定义控制器工厂。


protectedvoidApplication_Start()

[code]{
......


ControllerBuilder.Current.SetControllerFactory(newMyControllerFactory());

}


[/code]

输入old/index:




输入old/any:




输入new/index:




输入new/any:




输入home/index:




输入any/any:




参考资料:

ControllerFactoryandActionInvokerPart1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐