zoukankan      html  css  js  c++  java
  • 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作为测试,如图:

    测试结果如下:

    这样就简单的实现了通过博主的需求。。

    完整工程下载:

    https://files.cnblogs.com/files/wxb8/DynamicController.zip

  • 相关阅读:
    CodeForces 659F Polycarp and Hay
    CodeForces 713C Sonya and Problem Wihtout a Legend
    CodeForces 712D Memory and Scores
    CodeForces 689E Mike and Geometry Problem
    CodeForces 675D Tree Construction
    CodeForces 671A Recycling Bottles
    CodeForces 667C Reberland Linguistics
    CodeForces 672D Robin Hood
    CodeForces 675E Trains and Statistic
    CodeForces 676D Theseus and labyrinth
  • 原文地址:https://www.cnblogs.com/wxb8/p/7191441.html
Copyright © 2011-2022 走看看