2016-07-08 37 views
2
報表

目前我在C#我的會員角色代碼結構像下面這樣有沒有更好的方式來顯示與角色的HTML代碼比如果MVC剃刀意見

@if (WebApiApplication.CurrentUser.CurrentRole == Role.SysAdmin || WebApiApplication.CurrentUser.CurrentRole == Role.Coordinator) 
{ 
    <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li> 
    <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li> 
    <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li> 
    <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li> 
} 
@if (WebApiApplication.CurrentUser.CurrentRole == Role.User) 
{ 
    <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li> 
    <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li> 
    <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li> 
    <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li> 
} 

@if (WebApiApplication.CurrentUser.CurrentRole == Role.Intern) 
{ 
    <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li> 
    <li id="TimecardMenu" class="@Model.GetMenuClass("TimecardMenu")"><a href="@Url.Action("Timecard", "Assigments")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li> 
    <li id="FeedbackMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Feedback", "Assigments")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li> 
    <li id="SupportMenu" class="@Model.GetMenuClass("SupportMenu")"><a href="@Url.Action("Index", "Support")"><i class="fa fa-question-circle"></i>&nbsp;&nbsp;Support</a></li> 
} 

做這將是多麼美好處理方式角色邏輯代替剃刀查看?在C#模型中做它?

+0

我看到它這樣使用此頁面http://www.asp.net/web-pages/overview/security/16-adding-security-and-上成員 –

+2

該代碼不應該在視圖中。你的邏輯應該在控制器中,並將適當的模型傳遞給視圖(一組菜單項)並使用一個簡單的循環來生成鏈接 –

+0

好吧,IMO你只是用一些不同的鏈接反覆重複自己一些角色您當然可以做到這一點,但只要考慮隨着時間的推移將其維護在SDLC中即可。 –

回答

0

我認爲這樣的事情可以在視圖中處理,因爲它處理頁面中菜單項的顯示。

正如其他人在評論中提到的那樣,最好在視圖模型中定義映射到用戶角色並使用它的屬性。

您可以改用switch語句,並將適用於不同角色的選項分組。例如,我在您的示例中注意到,角色SysAdmin,協調員和用戶都具有相同的菜單項,所有角色都可以訪問主菜單,並且只有角色實習生可以看到TimeCard,反饋和支持菜單。

見下面的例子:

<li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li> 

    @switch (WebApiApplication.CurrentUser.CurrentRole) 
     { 
      case Role.SysAdmin: 
      case Role.Coordinator: 
      case Role.User: 
      <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li> 
      <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li> 
      <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li> 
      break; 
      case Role.Intern: 
      <li id="TimecardMenu" class="@Model.GetMenuClass("TimecardMenu")"><a href="@Url.Action("Timecard", "Assigments")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li> 
      <li id="FeedbackMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Feedback", "Assigments")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li> 
      <li id="SupportMenu" class="@Model.GetMenuClass("SupportMenu")"><a href="@Url.Action("Index", "Support")"><i class="fa fa-question-circle"></i>&nbsp;&nbsp;Support</a></li> 
      break; 
     } 
+1

如果菜單和角色幾乎沒有變化,我認爲將它放在視圖中是完全正確的。對我來說很清楚,它可以放入一個佈局中,以便重複使用,而且可以在不需要重新編譯整個項目的情況下進行簡單的更改 –

+0

這不是一個好的解決方案,因爲它只適用於此視圖。如果在另一個頁面上的鏈接指向相同的控制器操作,該怎麼辦?每一種觀點都會散佈着案例陳述?這裏概述一個更好的解決方案。 http://stackoverflow.com/questions/8197551/how-to-hide-action-link-if-user-has-no-rights-to-action – Fran

+0

@Fran你正在暴露的問題的一個很好的解決方案是斯蒂芬如上所述,將上面的case語句添加到您的共享佈局視圖中。佈局視圖旨在用於公用資源(例如導航/菜單,頁腳等)與其他頁面共享。 –

相關問題