我在项目中仅为区域部分启用了功能文件夹结构。
为了解释我为什么这样做,这是因为我的区域中有太多的控制器(超过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