2009-12-07 63 views
7

Tôi đang cố gắng tìm hiểu cách hiển thị/ẩn liên kết cho người dùng dựa trên vai trò của họ. Tôi biết cách đặt thuộc tính ủy quyền cho một phương thức hành động, nhưng tôi đang gặp khó khăn khi tạo liên kết hiển thị ẩn trong chế độ xem nếu người dùng nói, quản trị viên hoặc người quản lý trong cơ sở dữ liệu vai trò của tôi.Hiển thị/Ẩn liên kết trong một ASP.Net MVC Xem

Bất kỳ bài viết hay ví dụ mã nào tốt mà ai đó có thể chỉ cho tôi?

Trả lời

11

Trong chế độ xem của bạn, bạn có thể tham chiếu người dùng IPrincipal thông qua thuộc tính 's User.

Ví dụ: Theo quan điểm của bạn, bạn có thể có một cái gì đó như:

<% if (User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Admin only link", "Edit", "Users") %> 
<% } %> 

<% if (User.IsInRole("Manager") || User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Manager & Admin only link", "Edit", "Product") %> 
<% } %> 

HTHs,
Charles

+0

Cảm ơn! Dưới đây là một twist - Tôi có các liên kết tab của tôi trong trang cái và tôi muốn một tab xuất hiện cho các vai trò nhất định. Bạn có biết làm thế nào tôi có thể thêm một tham chiếu đến chủ của tôi cho IPrincipal? – Ben

+2

Sử dụng hoặc 'HttpContext.Current.user' hoặc' ViewContext.HttpContext.User' - điều đó sẽ thực hiện thủ thuật :-) – Charlino

+0

Ahh, bây giờ tôi có thể tiếp tục với mọi thứ ... Tôi đánh giá cao sự trợ giúp! – Ben

2

này được một điều tôi thực sự không thích với MVC (như trong ASP.Net MVC, không phải là mô hình) có một có xu hướng di chuyển logic UI vào đánh dấu.

Không có cách nào để chạy kiểm tra Đơn vị trên lôgic đó khi nó ở trong aspx.

Cá nhân tôi nghĩ rằng biểu mẫu web có mẫu giao diện người dùng phù hợp (MVC hoặc MVP v.v.) sẽ phù hợp hơn so với việc có trang rải rác với logic điều kiện không thể kiểm tra được.

+1

Vì tôi vẫn coi bản thân mình là người mới bắt đầu, tôi ngày càng tốt hơn và tôi hoàn toàn đồng ý với những gì bạn đang nói và đã vứt bỏ những trang đánh dấu của tôi. Tôi làm việc trong webforms tại công việc ban ngày của tôi và MVC trên các dự án tự do của tôi và có nhiều đau đầu xung đột với việc học cả hai cùng một lúc. Mặc dù tôi đã không học được nhiều về làm thế nào để kiểm tra đơn vị - tôi sẽ không có nghi ngờ cần nó một ngày trong tương lai gần; và tôi hy vọng vào lúc đó nhóm MVC sẽ giải quyết vấn đề này. Cảm ơn bạn đã nhận xét +1 -ben – Ben

+2

Sử dụng Selenium để kiểm tra giao diện người dùng. Bạn có thể chạy thử nghiệm bằng cách sử dụng các vai trò khác nhau và sau đó kiểm tra sự tồn tại của các điều khiển HTML (vâng vần). – Bob

1
<% if(HttpContext.Current.User.IsInRole("Admin")){%> <a href="/Admin">Admin</a> <% } %> 

Sử dụng mã này. Điều này dễ dàng hơn.

0

Tôi sử dụng lớp tĩnh để xác thực vai trò và trong cshtml tôi đã sử dụng lớp này, việc xác thực vai trò là cshtml.

Tôi có các chức năng hoặc nội dung được ủy quyền trong cơ sở dữ liệu (bởi người dùng hoặc theo vai trò) để bạn không phải triển khai lại nếu thay đổi định nghĩa truy cập.

public static class AuthorizeContent 
{ 
    public static bool AuthorizeAccessContent(string Content) 
    { 
     bool bReturn = false; 
     DBContext db = new DBContext(); 
     string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName); 

     foreach (AuthorizedContentRole aut in db.AuthorizedContentRole) 
     { 
      foreach (string rol in RolesUser) 
      { 
       if (aut.Role==rol && aut.Content==Content) 
       { 
        bReturn = true; 
        break; 
       } 
      } 
     } 
     foreach (AuthorizedContentUser aut in db.AuthorizedContentUser) 
     { 
      if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content) 
      { 
       bReturn = true; 
       break; 
      } 
     } 

     return bReturn; 
    } 

/// trong cshtml

@if (AuthorizeContent.AuthorizeAccessContent(Content)) 
{ 

    <li class="two"> 
     <h5>Administrator link</h5> 
     @Html.ActionLink("Admin secret info","Index", "Information") 
    </li> 
} 

bạn cũng có thể sử dụng một bộ lọc như [AccionAuthorize (Action = "MyContent")]

public class AccionAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Action { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     else if (!AutorizacionContenido.AutorizaAccesoContenido(Action)) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     base.OnAuthorization(filterContext); 
    } 
} 
Các vấn đề liên quan