2011-12-07 12 views
14

Tôi đang làm việc trên trang web ASP.Net MVC 3. Quan điểm chủ _Layout chứa một menu và tôi muốn để ẩn một số mục trong menu dựa trên nếu bạn đã đăng nhập và những gì vai trò bạn đang ở.ASP.Net MVC Ẩn/Hiển thị các mục menu Dựa trên An ninh

này hiện đang hoạt động sử dụng mã như thế này

@if (HttpContext.Current.User.Identity.IsAuthenticated) 
{ 
    <li id="MyLearningTab">@Html.ActionLink("My Learning", "MyLearning", "Learning")</li> 
    if (HttpContext.Current.User.IsInRole("Reporters")) 
    { 
     <li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li> 
    } 
    if (HttpContext.Current.User.IsInRole("Administrators")) 
    { 
     <li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li> 
     <li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li> 
    } 
} 

tôi muốn refactor này trong một cái gì đó dễ đọc hơn và đã đưa ra một cái gì đó như thế này

@if ((bool)ViewData["MenuMyLearning"]){<li id="MyLearningTab">@Html.ActionLink("My Learning", "MyLearning", "Learning")</li> }  
@if((bool)ViewData["MenuReports"]){<li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li>} 
@if ((bool)ViewData["MenuDashboard"]){<li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li>} 
@if ((bool)ViewData["MenuAdmin"]){<li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li>} 

tôi ban đầu thêm dòng sau vào cơ sở điều khiển constructor suy nghĩ của tôi, tôi có thể thiết lập các ViewData cho các đặc tính này có

012.
ViewData["MenuDashboard"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators"); 
ViewData["MenuAdmin"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators"); 
ViewData["MenuReports"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Reportors"); 
ViewData["MenuMyLearning"] = User != null && User.Identity.IsAuthenticated; 

Tuy nhiên, đối tượng người dùng không có giá trị tại thời điểm này trong vòng đời. Tôi cũng đã cố gắng tạo một bộ lọc tùy chỉnh toàn cục nhưng không thể truy cập vào ViewData.

Cách được khuyến nghị thực hiện như thế này là gì? Tôi có nên để nó như thế nào trước tiên với tất cả mã HttpContext trong khung nhìn không?

+0

Đây là một giải pháp khác http://stackoverflow.com/questions/17012643/role dựa trên điều hướng –

Trả lời

8

Đây là những gì tôi đã kết thúc. Tôi tạo ra một lớp trợ giúp được gọi là MenuSecurity với các thuộc tính boolean tĩnh cho mỗi mục trình đơn hiển thị các mục nào sẽ được hiển thị. Mỗi thuộc tính trông như thế này

public static bool DashboardVisible 
{ 
    get 
    { 
     return 
     HttpContext.Current.User != null && 
     HttpContext.Current.User.Identity.IsAuthenticated; 
    } 
} 

sau đó tôi dọn dẹp menu xem một phần của tôi trông như thế này

@if (MenuSecurity.ReportsVisible){<li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li>} 
@if (MenuSecurity.DashboardVisible){<li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li>} 
@if (MenuSecurity.AdminVisible){<li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li>} 
+0

Tôi nghĩ bạn chỉ có 3 nhóm. nhưng điều gì sẽ xảy ra nếu bạn có 20 - 30 nhóm? – kbvishnu

9

lời khuyên chung về vai trò

Con đường tôi đã làm điều này là để tạo ra một hiệu trưởng tùy chỉnh và để lưu trữ các thông tin cần thiết thêm trong đó. Trong ví dụ của bạn, điều này ít nhất sẽ bao gồm các vai trò cho người dùng. Bằng cách đó, bạn tránh thực hiện nhiều chuyến đi bổ sung tới cửa hàng người dùng (có khả năng là cơ sở dữ liệu SQL).

Có một cái nhìn một câu hỏi này của tôi trong đó tôi cung cấp cho đoạn code mà tôi đang sử dụng thành công: Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?

Lưu ý rằng tôi đang lưu trữ hiệu trưởng tùy chỉnh trong bộ nhớ cache hơn là trong phiên giao dịch (chỉ là hoang tưởng về việc chiếm đoạt phiên).

Tôi thích phương pháp này vì nó rất dễ mở rộng. Ví dụ, tôi đã mở rộng này để lộ thông tin đăng nhập Facebook khi người dùng đăng nhập qua Facebook.

Chỉ cần nhớ rằng nếu bạn đang lưu vào bộ nhớ cache dữ liệu bạn cần nhớ để cập nhật dữ liệu khi thay đổi!

trả lời cho câu hỏi của bạn

Chỉ cần thêm, trong trường hợp cụ thể của bạn, bạn nên có lẽ lưu trữ thông tin thêm này trong ViewModel và sau đó xem bạn sẽ nói những câu như:

@if(ShowReports) { <li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li> } 
@if(ShowDashboard) { <li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li> } 
@if(ShowAdmin { <li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li> } 

với Mã ViewModel nói điều gì đó như:

public bool ShowReports {get;set;} 
public bool ShowDashboard {get;set;} 
public bool ShowAdmin {get;set;} 

public void SetViewModel() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
    if (HttpContext.Current.User.IsInRole("Reporters")) 
    { 
     ShowReports = true; 
    } 
    if (HttpContext.Current.User.IsInRole("Administrators")) 
    { 
     ShowDashboard = true; 
     ShowAdmin = true; 
    } 
    } 
} 

Tôi thực sự có xu hướng thực hiện việc này ep thêm và tạo một ReportsLink trong ViewModel của tôi và đặt nó để chứa liên kết nếu người dùng được ủy quyền hoặc là chuỗi trống nếu họ không. Sau đó, quan điểm chỉ nói:

@Model.ReportsLink 
@Model.DashboardLink 
@Model.AdminLink 

Trong trường hợp đó phần liên hệ của ViewModel có thể là như thế này:

ReportLink = new MvcHtmlString(HtmlHelper.GenerateLink(HttpContext.Current.Request.RequestContext, System.Web.Routing.RouteTable.Routes, "linktext", "routename", "actionname", "controllername", null, null)); 
+0

Nơi nào bạn gọi SetViewModel() từ ??? – dannyrosalex