2016-10-24 25 views
1

我正在開發一個ASP.NET MVC 5項目,我想在這個post上顯示Jimmy Bogard應用的「Feature-Driven design」。但是我想修改自己的設計到功能分成由角色的另一細分,所以我的計劃是有我的ASP.NET MVC項目以這種方式構成:修改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視圖的自定義位置,但我無法配置它們以匹配位置I在我的樹圖中顯示你,這就是爲什麼我要求你的幫助。

我不擅長ASP.NET MVC,這是我第一次嘗試在我學習新事物的方式上實現這個設計。我真的想得到這個工作。

感謝您的指導。

更新1

看到從@IvanGritsenko答案後,我注意到,每個控制器必須能夠處理多個操作(該功能),而且很多角色可能具備的功能(控制器)與相同的名稱,例如「索引」,每個角色都會有一個索引,它將是一個自定義的「儀表板」(顯示該角色的自定義信息)。

有關思考,我認爲這將是巨大的,如果:

1)通過某種方式的用戶已登錄後,我可以解決控制器的位置。所以,如果我查找索引控制器,它可以在特定的角色文件夾中查找它。

或者

2)路由被修改的用戶已登錄在後向模式/角色/控制器/功能相匹配。

+0

覆蓋'RazorViewEngine.FindView','RazorViewEngine。FindPartialView' –

+0

@IvanGritsenko我已經做到了,但我無法弄清楚寫出控制器和視圖的位置格式的正確形式 –

+0

根據Jimmy Bogard提供的ContosoUniversity示例(https://github.com/jbogard/ContosoUniversity/ blob/master/src/ContosoUniversity/Infrastructure/FeatureViewLocationRazorViewEngine.cs),他的路由很簡單'Features/{controller}/{action}' –

回答

1

第1步。創建自定義視圖引擎。在Global.asax中

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.註冊自定義視圖引擎。在控制器RouteConfig

routes.MapRoute(name: "Default", url: "{role}/{controller}", defaults: new { action = "Index" }); 

public class UserManagementController : Controller 
{ 
    // GET: UserManagement 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

網址示例

protected void Application_Start() 
{ 
    ... 
    ViewEngines.Engines.Add(new MyViewEngine()); 
} 

步驟3.更改缺省路由調用UserManagementControllerIndex動作。

http://domainname.com/Admin/UserManagement

+0

這種方法有可能是一個Controller有N個動作,可以說LogInController具有: 1動作繪製視圖(默認獲取),1動作驗證用戶的數據之前提交(POST由AJAX調用),最後1動作,將提交表單(POST由AJAX調用),這可能嗎?據我瞭解,您的解決方案只需要每個Controller一個動作,並調用諸如site/LogInController/Validate之類的東西將無效 –

+0

此時我沒有考慮Actions。他們可能很容易添加。你想能夠使用任何視圖名稱,如'返回視圖('SomeView')'?另外'IndexController'的目的是什麼?這種解決方案實際上不會對許多同名控制器起作用。沒辦法現在調用'IndexController'。 –

+0

是的,索引將是每個角色的自定義主要儀表板(等待操作,警報等),因此它在動作和用戶界面上會有所不同 –

相關問題