4

在 ASP.NET 中,执行以下操作的最佳方法是什么:

  1. 根据您的权利显示某些控制?
  2. 对于 gridview 控件,如何根据您的角色显示某些列?

我在考虑第 2 点,让数据来自数据库上的角色特定视图。

4

2 回答 2

5

我建议不要实际使用角色来隐藏/显示某些控件,而是建议为每个角色设置另一层权限,然后根据这些权限显示/隐藏。

这样,您可以重新定义角色拥有的权限,而不必更改您的代码。

此外,这允许您在将来创建新角色,只需为该角色分配一组权限。

至于控件,是的...我将根据 user.IsInRole("permissionname") 值在控件上设置 Visible 属性。

对于网格,我也会这样做...将列的可见性设置为 IsInRole 布尔值。

//Delete Icon Column
gridViewContacts.Columns[0].Visible = user.IsInRole("DeleteAnyContact"); 

我会以非常精细的性质创建您的权限..例如

  • ViewAnyContact
  • 查看OwnContact
  • EditOwnContact
  • EditAnyContact
  • 添加任何联系人
  • 删除OwnContact
  • 删除任何联系人
  • ETC...
于 2008-10-16T20:17:48.350 回答
1

如果您要走基于角色的路线,ASP.NET(从 2.0 版开始)提供了多种成员资格控制,这可能在这种情况下有所帮助。假设(这很可能是一个错误的假设)您正在使用收件箱成员资格提供程序,您实际上可以使用LoginView控件来处理#1。

它的工作方式是LoginView可以使用RoleGroups及其关联ContentTemplates来根据角色为用户自定义视图。这与收件箱会员提供商无缝协作;我相信,如果您基于微软的技术建立自己的会员服务提供商,它也将起作用。(我还没有完成后一步。)

可以想象,您可以将它用于#2,但最终会产生重复的代码和工作量,这不是我个人的偏好。我认为您选择使用特定于角色的 SQL 视图来驱动该表可能比这个选项更好。(当然,还有其他选择,可能会更好。)

我将支持 Elijah Manor 关于使用权限而不是角色的建议。一般来说,这也是我的偏好。(我惊讶地发现会员提供者的技术并没有达到那个水平。)但是,在任何以许可为中心的场景中,您基本上必须自己滚动所有内容。(我已经这样做了,虽然它非常灵活,但保护任何给定页面的代码可能会变得很麻烦。)

编辑:我道歉;我的意思是包含 LoginView 控件的链接。DotNetJunkies 有一个关于它的教程

于 2008-10-16T20:28:51.900 回答