【问题标题】:how to hide or show links based not only on roles but other business logic如何不仅基于角色而且基于其他业务逻辑隐藏或显示链接
【发布时间】:2013-05-17 00:04:35
【问题描述】:

我的 MVC 应用程序有几个角色。前管理员,一般。我使用了 CustomRoleProvider,但随后在视图中我执行以下操作

@if (Roles.IsUserInRole("admin"))
    {
        <div class="editor-label">@Html.RadioButton("selection", "View Project Details", false)View Project Details</div>
    } 

最近我被告知要根据业务逻辑额外限制访问。如果用户在项目上创建的是“xyz”,则允许“xyz”访问链接。 我知道一种方法是检查控制器并根据角色和业务逻辑返回不同的视图。那将是无法控制的! 有没有其他方法可以实现这一目标?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor html-helper


    【解决方案1】:

    您可以只将权限存储在您的模型或 ViewBag 中,并使用上述 if 语句。您还可以创建IsInBuissnesRole 之类的方法并在其中实现逻辑。

    【讨论】:

    • 我应该在哪里创建这个方法?在角色提供者中?
    • 角色提供者是个好地方。但你也可以在基本控制器中实现它
    【解决方案2】:

    我已经回答了类似的问题here

    基本上,您应该使用带有属性的视图模型,这些属性表示视图的某些功能是否应该对用户启用/可见。然后是控制器(可能基于某些业务逻辑服务)应该设置这些值。

    例子:

    // Model
    public class Procuct
    {
      public int Id {get; set;}
      public string Name {get;set;}
    }
    
    
    // Viewmodel
    public class ProcuctViewModel
    {
      public int Id {get; set;}
      public string Name {get;set;}
      public bool CanEdit {get;set;}
      public bool CanDelete {get; set;}
    }
    
    // somewhere in controller
    var product = new ProductViewModel(_repo.GetProductById(1));
    if (Roles.IsUserInRole("admin"))
    {
      product.CanEdit = true;
    }
    // ...
    return View(product);
    

    然后您的视图变得更简单,所有安全性内容都移至控制器并且可单元测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      相关资源
      最近更新 更多