如何隐藏或显示不仅基于角色而且基于其他业务逻辑的链接

时间:2013-05-22 04:02:55

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

我的MVC应用程序有一些角色。前任管理员。我使用CustomRoleProvider然后在视图中执行

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

最近我被告知要根据业务逻辑ex另外限制访问。如果用户在项目上创建了'xyz',则允许'xyz'访问该链接。 我知道一种方法是检查控制器并根据角色和BusinessLogic返回不同的视图。多数民众赞成无法管理! 有没有其他方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经回答了类似问题here

基本上,您应该使用viewmodel,其属性表示是否应该为用户启用/显示视图的某些功能。然后它是控制器(可能基于一些业务逻辑服务)应该设置这些值。

示例:

// 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);

然后您的视图变得更简单,并且所有安全性内容都被移动到控制器并且是unittestable