【问题标题】:Silverlight -- how to display element based on user securitySilverlight——如何基于用户安全显示元素
【发布时间】:2010-06-30 03:02:07
【问题描述】:

我是 Silverlight 新手...

我想要一个基于当前用户安全角色显示元素(按钮、网格、图像)的页面。基本上,我想将所需的安全角色附加到一个元素,并调用我的代码来决定该元素是否会显示。

类似(添加属性RequiredRole

<Button RequiredRole="Administrator" x:Name="PushBtn" Content="PushMe"/>

在这种情况下,如果用户没有足够的安全权限,我的代码会将 Button.visibility 设置为隐藏。

我在文档中找不到任何可以帮助我实现类似目标的内容(可能是 DependentProperties 除外)。

如何做到这一点? (如果这是思考这个问题的正确方法......)

谢谢。

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    您有逻辑来确定用户的角色并希望相应地切换可见性?听起来你已经走在正确的轨道上了。 attached property 怎么样?您可以在定义属性元数据时包含 PropertyChangedCallback。该 PropertyChangedCallback 方法可以处理切换可见性。

    这是基本的想法......

    public static class RequiredRoleSupport
    {
        public static readonly DependencyProperty RequiredRoleProperty = DependencyProperty.RegisterAttached("RequiredRole", typeof(string), typeof(RequiredRoleSupport), new PropertyMetadata(ValidateRole));
    
        public static string GetRequiredRole(DependencyObject obj)
        {
            return (string)obj.GetValue(RequiredRoleProperty);
        }
    
        public static void SetRequiredRole(DependencyObject obj, string value)
        {
            obj.SetValue(RequiredRoleProperty, value);
        }
    
        private static void ValidateRole(object sender, DependencyPropertyChangedEventArgs e)
        {
            var control = sender as Control;
            var roleValue = (string)e.NewValue;
    
            // Logic to check roleValue against current user role and modify control accordingly
        }
    }
    

    XAML

    <UserControl xmlns:roleSupport=...
    
    <Button roleSupport:RequiredRoleSupport.RequiredRole="Administrator" x:Name="PushBtn" Content="PushMe"/>
    

    【讨论】:

    • 谢谢——这是我心中的想法,但我缺乏细节。我会试试这个。
    【解决方案2】:

    一种方法是将按钮绑定到命令对象。在命令对象的“CanExecute”上,您将执行安全检查。当然,这仅适用于按钮。

    可能更有趣的方法是创建一个对象来管理您的安全性并通过索引器提供安全性值。您可以为与对象交互的元素可见性创建行为。然后,你会做这样的事情:

    安全行为会在附加的按钮中,查询安全系统,如果用户没有被授权,则折叠可见性。

    【讨论】:

    • 这不会使绑定到元素的实际值仍然可用于诸如 SilverlightSpy 之类的调试器工具吗?在保护您的 GUI 时,这可能不是您想要的。
    【解决方案3】:

    递归枚举给定表单上的所有控件并相应地设置它们的可见性。您可以将此逻辑放在帮助程序或基类中。

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
    
            foreach (var control in LayoutRoot.GetVisuals().OfType<Control>())
                control.Visibility = Visibility.Collapsed;
        }
    }
    
    public static class ExtensionMethods
    {
        public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root)
        {
            int count = VisualTreeHelper.GetChildrenCount(root);
    
            for (int i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(root, i);
                yield return child;
    
                foreach (var descendants in child.GetVisuals())
                    yield return descendants;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2012-02-25
      • 2020-05-08
      • 1970-01-01
      相关资源
      最近更新 更多