2009-12-07 42 views
7

我想弄清楚如何根据用户角色显示/隐藏用户链接。我知道如何为操作方法设置authorize属性,但是如果用户在我的角色数据库中是说,管理员或管理员,则无法在链接中显示隐藏。在ASP.Net MVC视图中显示/隐藏链接

任何好的文章或代码示例有人可以指向我?

回答

11

在您的意见中,您可以通过System.Web.Mvc.ViewPageUser财产来引用IPrincipal用户。

E.g.在你看来,你可以有这样的:

<% 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,
查尔斯

+0

由于过滤器!这里有一个转折点 - 我在母版页中有我的标签链接,我希望为特定角色显示一个标签。你知道我可以如何给IPrincipal的主人添加一个参考吗? – Ben 2009-12-07 06:54:41

+2

使用'HttpContext.Current.user'或'ViewContext.HttpContext.User' - 应该这样做:-) – Charlino 2009-12-07 07:03:03

+0

啊,现在我可以继续前进......感谢帮助! – Ben 2009-12-07 07:10:17

2

这是一两件事,我真的不喜欢用MVC(如在ASP.Net MVC,不是模式)有一个将UI逻辑转化为标记的趋势。

一旦它在aspx中,就没有办法对该逻辑运行单元测试。我个人认为带有合适的UI模式(MVC或MVP等)的webforms会比页面上散布着无法测试的条件逻辑更合适。

+1

因为我仍然认为自己是初学者,所以我越来越好,我完全同意你的意见,并且从我的标记页面中散布出来。我在我的日常工作和MVC上工作在我的自由职业项目中,并且在同时学习两种方面有许多相互冲突的头痛。尽管我还没有学会如何进行单元测试 - 我不久就会需要它;我希望到那时MVC团队会解决这个问题。感谢您的评论+1 -ben – Ben 2010-09-22 02:01:13

+2

使用Selenium进行UI测试。您可以使用不同的角色运行测试,然后测试HTML控件的存在性(嘿,那就是押韵)。 – Bob 2012-10-19 18:26:29

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

使用此代码。这很容易。

0

我使用一个静态类进行角色验证,并在cshtml中使用这个类,角色验证不在cshtml中。

我有我的授权功能或数据库中的内容(由用户或角色),所以如果访问定义更改,您不必重新部署。

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; 
    } 

///在CSHTML

@if (AuthorizeContent.AuthorizeAccessContent(Content)) 
{ 

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

你也可以使用像[AccionAuthorize(动作= “为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); 
    } 
}