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:
[code]{
[/code]
□NewProductController:
[code]
[/code]
□OldProductController:
通过实现IController接口,根据从路由中拿到的action名称,实现自定义响应。
[code]
[/code]
□MyControllerFactory
实现IControllerFactory接口,当controller名称是new的时候,返回NewProductController;当controller名称是old,返回OldProductController;默认情况下返回Home/Index。
[code]usingSystem.Web.Mvc;
[/code]
全局注册自定义控制器工厂。
[code]{
[/code]
输入old/index:
输入old/any:
输入new/index:
输入new/any:
输入home/index:
输入any/any:
参考资料:
ControllerFactoryandActionInvokerPart1
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:
参考资料:
相关文章推荐
- MVC扩展控制器工厂,通过继承DefaultControllerFactory来决定使用哪个接口实现,使用Ninject
- LINQ 通过动态生成lambda表达式,实现根据指定属性名称对序列进行排序
- ASP.NET MVC扩展之IControllerFactory和IActionInvoker
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
- asp.net mvc 中"未找到路径“/favicon.ico”的控制器或该控制器未实现 IController。"
- YbSoftwareFactory 代码生成插件【十】:ASP.NET WebApi MVC下审计、缓存和导出功能的实现
- 通过JQuery调用MVC的Controller方法来实现无刷新操作
- ctreectrl 通过onpaint 重绘实现根据需要使各节点颜色不同
- SpringMVC—ParameterizableViewController控制器实现跳转页面
- 通过jaxb实现 根据xml生成Ojbect
- HttpHandlerFactory来根据不同的后缀名调用不通的图片生成Handler来生成图片
- delphi根据不同图片生成不规则窗口的实现(仅限于BMP格式)
- Spring MVC MultiActionController---多动作控制器
- MVC 002 MVC中获取控制器和Action名称的几种方法
- MVC扩展(ControllerFactory VS DependencyResolver)
- MVC中的扩展点(三)控制器工厂
- asp.net mvc 中"未找到路径“/favicon.ico”的控制器或该控制器未实现 IController。"
- MVC中的扩展点(二)控制器工厂