我正在开发一个ASP.NET MVC 5项目,我想在其中应用"功能驱动的设计"吉米·博加德(Jimmy Bogard)在post上展示了这一点。但我想修改他的设计,将功能分成另一个按角色划分的部门,所以我的计划是以这种方式构建我的ASP.NET MVC项目:
MyRoleFeatureProject
├── Roles
│ ├── Manager
│ │ ├── Features
│ │ │ ├── Index
│ │ │ │ ├── Index.cshtml
│ │ │ │ ├── Index.js
│ │ │ │ ├── IndexController.cs
│ │ │ ├── Invoice
│ │ │ │ ├── Invoice.cshtml
│ │ │ │ ├── Invoice.js
│ │ │ │ ├── InvoiceController.cs
│ ├── Admin
│ │ ├── Features
│ │ │ ├── Index
│ │ │ │ ├── Index.cshtml
│ │ │ │ ├── Index.js
│ │ │ │ ├── IndexController.cs
│ │ │ ├── UserManagement
│ │ │ │ ├── UserManagement.cshtml
│ │ │ │ ├── UserManagement.js
│ │ │ │ ├── UserManagementController.cs
│ ├── Operator
│ │ ├── Features
│ │ │ ├── Index
│ │ │ │ ├── Index.cshtml
│ │ │ │ ├── Index.js
│ │ │ │ ├── IndexController.cs
│ │ │ ├── Shipping
│ │ │ │ ├── Shipping.cshtml
│ │ │ │ ├── Shipping.js
│ │ │ │ ├── ShippingController.cs
│ ├── Anonymous
│ │ ├── Features
│ │ │ ├── LogIn
│ │ │ │ ├── LogIn.cshtml
│ │ │ │ ├── LogIn.js
│ │ │ │ ├── LogInController.cs
│ │ │ ├── Register
│ │ │ │ ├── Register.cshtml
│ │ │ │ ├── Register.js
│ │ │ │ ├── RegisterController.cs
│ │ │ ├── ForgotPassword
│ │ │ │ ├── ForgotPassword.cshtml
│ │ │ │ ├── ForgotPassword.js
│ │ │ │ ├── ForgotPasswordController.cs
│ ├── Shared
│ │ ├── _ManagerLayout.cshtml
│ │ ├── _AdminLayout.cshtml
│ │ ├── _OperatorLayout.cshtml
│ │ ├── _AnonymousLayout.cshtml
│ ├── _ViewStart.cshtml
│ ├── Web.config
├── Images
├── Scripts
├── Styles
├── Web.config
我已经关注了一些在线指南,我知道我需要创建一个继承自 DefaultControllerFactory 的类,用于控制器的自定义位置,还有一个继承自的类RazorViewEngine 用于查看自定义位置,但我无法将其配置为与我在树形图中显示的位置相匹配,这就是为什么我&#39 ; m寻求你的帮助。
我不是ASP.NET MVC的专家,这是我第一次尝试在学习新东西的过程中实现这个设计。我真的很想让这个工作。
感谢您的指导。
更新1
在看到@IvanGritsenko的答案后,我注意到每个控制器必须能够处理多个动作(对于该功能),并且许多角色可能具有相同名称的功能(控制器),例如& #34;索引",每个角色都有一个自定义"仪表板" (显示该角色的自定义信息)。
考虑到这一点,我认为如果:
会很棒1)通过某种方式,我可以在用户登录后解析Controller的位置。因此,如果我查找索引控制器,它可以在特定角色文件夹中查找它。
或者
2)在用户登录后修改路由以匹配模式/角色/控制器/功能。
答案 0 :(得分:1)
步骤1.创建自定义视图引擎。
public class MyViewEngine : RazorViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
var roleName = controllerContext.RouteData.GetRequiredString("role");
var controllerName = controllerContext.RouteData.GetRequiredString("controller");
var path = string.Format("~/Roles/{0}/Features/{1}/{1}.cshtml", roleName, controllerName);
var layoutPath = string.Format("/Roles/Shared/_{0}Layout.cshtml", controllerName);
return new ViewEngineResult(new RazorView(controllerContext, path, layoutPath, false, null), this);
}
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
var roleName = controllerContext.RouteData.GetRequiredString("role");
var controllerName = controllerContext.RouteData.GetRequiredString("controller");
var path = string.Format("~/Roles/{0}/Features/{1}/{1}.cshtml", roleName, controllerName);
return new ViewEngineResult(new RazorView(controllerContext, path, null, false, null), this);
}
}
步骤2.在Global.asax中注册自定义视图引擎。
protected void Application_Start()
{
...
ViewEngines.Engines.Add(new MyViewEngine());
}
步骤3.更改RouteConfig
routes.MapRoute( name: "Default", url: "{role}/{controller}", defaults: new { action = "Index" });
控制器示例
public class UserManagementController : Controller
{
// GET: UserManagement
public ActionResult Index()
{
return View();
}
}
调用Index
的{{1}}行动的网址示例。