修改MVC项目以在基于特征的自定义路径

时间:2016-10-24 22:36:21

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

我正在开发一个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)在用户登录后修改路由以匹配模式/角色/控制器/功能。

1 个答案:

答案 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}}行动的网址示例。

http://domainname.com/Admin/UserManagement