为区域启用要素文件夹结构并获取所有控制器命名空间

时间:2016-09-23 10:15:13

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我在项目中仅为区域部分启用了功能文件夹结构。

为了解释我为什么这样做,这是因为我的区域中有太多的控制器(超过100个控制器),而且它甚至不是程序的一半。

无论如何,使用以下代码,我已为区域启用了功能文件夹:

        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine()
        {
            AreaViewLocationFormats = new[]
            {
                "~/Areas/{2}/Features/{1}/{0}.cshtml",
                "~/Areas/{2}/Features/Shared/{0}.cshtml",
            },
            AreaMasterLocationFormats = new[]
            {
                "~/Areas/{2}/Features/{1}/{0}.cshtml",
                "~/Areas/{2}/Features/Shared/{0}.cshtml",
            },
            AreaPartialViewLocationFormats = new[]
            {
                "~/Areas/{2}/Features/{1}/{0}.cshtml",
                "~/Areas/{2}/Features/Shared/{0}.cshtml",
            },
            FileExtensions = new[]
            {
                "cshtml",
            },
        });

它的工作正常,但是具有相同名称的控制器存在名称空间问题,例如Home Controller。

对于这个问题,我使用重构来获取路由配置的所有命名空间。

public override void RegisterArea(AreaRegistrationContext context)
    {
        var namespaces = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => typeof (AdminBaseController).IsAssignableFrom(type) && !type.Name.StartsWith("T4MVC_"))
            .Select(x => x.Namespace).ToArray();

        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: namespaces
        );
    }

我的问题是:这是处理太多控制器的好方法吗?还有一种更好的方法来注册带名称空间的路由吗?

-Areas
 --Admin
   ---Features
      ----Home
          *HomeController
          *Index.cshtml
          *IndexViewModel.cs
-Controllers
 *HomeController
-Models
 --Home
   *IndexViewModel
-Views
 --Home
   *Index.cshtml

0 个答案:

没有答案