asp.net Mvc 动态创建Controller
有这么个需求,Urls如下:
http://localhost:52804
http://localhost:52804/home/test
http://localhost:52804/test1
http://localhost:52804/test1/aaa
http://localhost:52804/test1/bbb
http://localhost:52804/test2/aaa
http://localhost:52804/test2/bbb
第1和2条url是代表真实存在Controller的,后面的都是需要动态生成Controller的,为了实现这样的需求,通过查找资料,可以重写DefaultControllerFactory实现。步骤和代码如下:
1、新建FolderControllerFactory.cs继承自DefaultControllerFactory
public class FolderControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
var controllerType = GetControllerType(requestContext, controllerName);
// 如果controller不存在,替换为FolderController
if (controllerType == null)
{
// 用路由字段动态构建路由变量
var dynamicRoute = string.Join("/", requestContext.RouteData.Values.Values);
controllerName = "Folder";
controllerType = GetControllerType(requestContext, controllerName);
requestContext.RouteData.Values["Controller"] = controllerName;
requestContext.RouteData.Values["action"] = "Index";
requestContext.RouteData.Values["dynamicRoute"] = dynamicRoute;
}
IController controller = GetControllerInstance(requestContext,controllerType);
return controller;
}
}
2、新建FolderController
public class FolderController : Controller
{
// GET: Folder
public ActionResult Index(string dynamicRoute)
{
string viewFile = "/Views/" + dynamicRoute + ".cshtml";
return View(viewFile);
}
}
3、修改路由规则
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"CatchAll",
"{*dynamicRoute}",
new { controller = "Folder", action = "Index" }
);
}
4、在Global.asax注册自定义的FolderControllerFactory
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(new FolderControllerFactory());
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
5、在Views下新建一些文件夹和View作为测试,如图:
测试结果如下:
这样就简单的实现了通过博主的需求。。
完整工程下载:
http://files.cnblogs.com/files/wxb8/DynamicController.zip
asp.net Mvc 动态创建Controller的更多相关文章
- asp.net mvc 动态编译生成Controller
做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的Controller,这时就需要用到运行时动态编译了.代码如下: using System.Web.Mv ...
- 白话ASP.NET MVC之三:Controller是如何解析出来的
我们在上一篇文章中介绍Controller激活系统中所涉及到的一些类型,比如有关Controller类型的相关定义类型就包括了IController类型,IAsyncController类型,Cont ...
- ASP.NET MVC 3.0 Controller基础
ASP.NET MVC 3.0 Controller基础 1.Controller类与方法 Controller(控制器)是ASP.NET MVC的核心,负责处理浏览器请求,并作出响应.Cotro ...
- MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型
为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By Tom Dykstra |July 30, 2013 Translated by litdwg ...
- ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串
ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串 2010-12-29 21:32 by 鹤冲天, 4289 阅读, 14 评论, 收藏, 编辑 用户输入的字符串前后的 ...
- ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB
您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity ...
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: Source Code 上图中,有一行代码: <tbody ...
- [转]ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB
您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity ...
- ASP.NET MVC动态生成网站菜单及子菜单
在开发ASP.NET MVC网站时,Insus.NET想实现动态产生网站的主菜单及子菜单. 你需要在网站管理后台管理此2张表(Menu,SubMenu)的信息,添加,删除,编辑,更新等. Sequen ...
随机推荐
- 项目管理之 SVN 管理软件 CornerStone for Mac
常用的项目管理有 Git 和 SVN.之前公司一直使用的是 Git,使用的是 SourceTree 客户端,据说 Git 比 SVN 要好,只能说各有特点吧,有兴趣的可以查看下两个的区别. 下面是学习 ...
- bug 修复:上传库存时前端回发file_name参数丢失;
# tmp_file = os.path.join(os.path.abspath('youcart/tmp'), json.loads(request.data).get('file_name')) ...
- Asp.Net Core写个共享磁盘文件Web查看器
本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+ ...
- Android面试题目2
1. 请描述下Activity的声明周期. onCreate->onStart->onRemuse->onPause->onStop->onRestart->onD ...
- javaScript 设计模式系列之二:适配器模式
介绍 适配器模式将一个类的接口转接成用户所期待的,有助于避免大规模改写现有客户代码. In software engineering, the adapter pattern is a softwar ...
- Win7安装Docker
系统环境 1. windows 7 旗舰版64位 i5-2450M CPU 8G内存 2.支持“ Hardware Virtualization Technology”,并且,“virtualiza ...
- Nginx实用教程(二):配置文件入门
Nginx配置文件结构 nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令. 一条简单指令由指令名.参数和结尾的分号(;)组成,例如: listen backlo ...
- Linux sort -g 的困惑
sort命令是帮我们依据不同的数据类型进行排序,排序的效率很高,因此也是很常用的命令. sort参考及说明:https://www.gnu.org/software/coreutils/manual/ ...
- phpcms列表页内容如何替换?
以aboutus.html页面为例. 1.将aboutus.html重新命名为list-aboutus.html: 2.在后台页面,在栏目列表中将栏目列表页模板设置为 list-aboutus.htm ...
- 怎么样刷新frameset的整个页面
<a href="main.html?a=2" target="_parent">? 设置a链接的target属性值为_parent即可