在 ASP.NET 中,执行以下操作的最佳方法是什么:
- 根据您的权利显示某些控制?
- 对于 gridview 控件,如何根据您的角色显示某些列?
我在考虑第 2 点,让数据来自数据库上的角色特定视图。
我建议不要实际使用角色来隐藏/显示某些控件,而是建议为每个角色设置另一层权限,然后根据这些权限显示/隐藏。
这样,您可以重新定义角色拥有的权限,而不必更改您的代码。
此外,这允许您在将来创建新角色,只需为该角色分配一组权限。
至于控件,是的...我将根据 user.IsInRole("permissionname") 值在控件上设置 Visible 属性。
对于网格,我也会这样做...将列的可见性设置为 IsInRole 布尔值。
//Delete Icon Column
gridViewContacts.Columns[0].Visible = user.IsInRole("DeleteAnyContact");
我会以非常精细的性质创建您的权限..例如
如果您要走基于角色的路线,ASP.NET(从 2.0 版开始)提供了多种成员资格控制,这可能在这种情况下有所帮助。假设(这很可能是一个错误的假设)您正在使用收件箱成员资格提供程序,您实际上可以使用LoginView
控件来处理#1。
它的工作方式是LoginView
可以使用RoleGroups
及其关联ContentTemplates
来根据角色为用户自定义视图。这与收件箱会员提供商无缝协作;我相信,如果您基于微软的技术建立自己的会员服务提供商,它也将起作用。(我还没有完成后一步。)
可以想象,您可以将它用于#2,但最终会产生重复的代码和工作量,这不是我个人的偏好。我认为您选择使用特定于角色的 SQL 视图来驱动该表可能比这个选项更好。(当然,还有其他选择,可能会更好。)
我将支持 Elijah Manor 关于使用权限而不是角色的建议。一般来说,这也是我的偏好。(我惊讶地发现会员提供者的技术并没有达到那个水平。)但是,在任何以许可为中心的场景中,您基本上必须自己滚动所有内容。(我已经这样做了,虽然它非常灵活,但保护任何给定页面的代码可能会变得很麻烦。)
编辑:我道歉;我的意思是包含 LoginView 控件的链接。DotNetJunkies 有一个关于它的教程。