2010-02-04 51 views
15

Tôi đã nhìn thấy một số câu hỏi tương tự, nhưng không có gì giống như những gì tôi đang cố gắng làm.Xây dựng Menu trang ASP.NET MVC chính Động, Dựa trên "Vai trò" của người dùng hiện tại

Đây là thực hiện của tôi hiện tại w/ra bất kỳ bảo mật:

<div id="menucontainer"> 
    <ul id="menu">    
     <li><%= Html.ActionLink("Main List", "Index", "AController")%></li> 
     <li><%= Html.ActionLink("Product List", "Index", "BController")%></li> 
     <li><%= Html.ActionLink("Company List", "Index", "CController")%></li> 
     <li><%= Html.ActionLink("User List", "Index", "DController")%></li> 
    </ul> 
</div> 

này là tốt, và các công trình trên. Tôi có [Authorize] Attributes setup trên Actions for CController và DController để ngăn chặn truy cập trái phép - nhưng tôi muốn xóa các mục đó khỏi menu cho người dùng không có Role đúng, bởi vì khi họ nhìn thấy nó và click trên đó và nó nói với họ rằng họ không được phép, họ sẽ muốn nó. Nếu họ không biết nó ở đó, điều đó tốt hơn cho tất cả mọi người tham gia ...

Điều gì đó cuối cùng là mục tiêu mà tôi đang cố gắng đạt được, nhưng tôi đang tìm kiếm thêm một MVC Flavored aproach, "chế độ xem" là "câm":

<div id="menucontainer"> 
    <ul id="menu">    
     <li><%= Html.ActionLink("Main List", "Index", "AController")%></li> 
     <li><%= Html.ActionLink("Product List", "Index", "BController")%></li> 
     <% If(Role = Roles.Admin) { %> 
     <li><%= Html.ActionLink("Company List", "Index", "CController")%></li> 
     <li><%= Html.ActionLink("User List", "Index", "DController")%></li> 
     <% } %> 
    </ul> 
</div> 
+0

Tôi ... tôi nghĩ vậy. Có hai cấp độ người dùng, Bình thường và Quản trị viên. Chỉ quản trị viên mới có thể xem danh sách Công ty và Người dùng, thuộc tính [Ủy quyền] trên bộ điều khiển ngăn truy cập trái phép, nhưng tôi muốn ẩn chế độ xem khỏi không phải của Quản trị viên để họ thậm chí không có ý tưởng rằng nó có trong đầu của họ. – Nate

Trả lời

15

Tôi đã làm một cái gì đó như thế này:

  • sử dụng một lớp cơ sở chung cho các bộ điều khiển của tôi ('lớp siêu kiểu')
  • trong BaseController, ghi đè OnActionExecuted (bạn cũng có thể định nghĩa một thuộc tính ActionFilter cho điều này)

Something như thế này:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // build list of menu items based on user's permissions, and add it to ViewData 
     IEnumerable<MenuItem> menu = BuildMenu(); 
     ViewData["Menu"] = menu; 
    } 

Trong trang chủ:

<% var model = ViewData["Menu"] as IEnumerable<MenuItem>; %> 
    <% Html.RenderPartial("Menu", model); %> 

(Lưu ý: trong thực tế, tôi có một MasterViewModel có chứa số những người khác mô hình trình đơn)

+0

Tôi cho rằng ActionExecutedContext sẽ có thông tin về người dùng hiện tại? và tôi chỉ cần cập nhật tất cả các bộ điều khiển của mình để kế thừa từ bộ điều khiển cơ sở mới mà tôi đã xác định? – Nate

+1

có, ActionExecutedContext cung cấp cho bạn quyền truy cập vào a.o. HttpContext – jeroenh

+2

@jeroenh: a.o. ? – Pretzel

2

Bạn có nghe về menu của MvcContribBuilder?

Nếu không, tôi đề nghị bạn hãy xem nó. Dự án ví dụ UI là một cách hay để bắt đầu học cách sử dụng nó.

0

Giống như @SD" cho biết, bạn có thể tạo ra một 'bóng' helper mà có thể hiển thị liên kết hay không, dựa trên yêu cầu bảo mật của bạn.

Đây là một đọc tốt về những người giúp đỡ tùy chỉnh (hướng về phía dưới):

understanding-html-helpers on S. Walther's blog

1

Thông thường tôi chỉ cần kiểm tra vai trò trong một cách tương tự như bạn đã làm và sau đó, hoặc làm cho một cái nhìn cục bộ với các liên kết hoặc chỉ cần tạo chúng. Một cái gì đó như thế này bằng cách sử dụng cú pháp Razor. Tôi sử dụng T4MVC cho hành động.

@if(User.IsInRole("Admin")) 
{ 
    <li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li> 
} 

Vì lý do bảo mật, tôi sử dụng Bảo mật thông thạo. Hy vọng điều này sẽ hữu ích.

2

Không ai được đề cập MvcSiteMapProvider thực hiện việc này và có thể dễ dàng tích hợp vào dự án Visual Studio của bạn bằng NuGet.

0

Giải pháp của Joe cho đến nay là đơn giản nhất và hiệu quả đối với tôi. Tôi có các trang có trong các khu vực riêng biệt mà tôi cần phải nhanh chóng thiết lập một hệ thống menu phản ứng và hoạt động dựa trên khu vực mà người dùng có mặt.Ngoài ra trong trường hợp của tôi không có liên kết giữa các khu vực trong hệ thống của tôi, vì vậy sẽ tiếp theo configure multiple sitemaps for the MvcSiteMapProvider.

Hy vọng điều này sẽ giúp bất kỳ ai khác tìm kiếm giải pháp đơn giản và hiệu quả!

Các vấn đề liên quan