Silverlight - 基于用户角色控制可见性

时间:2011-12-14 21:57:03

标签: silverlight authentication roles

我试图弄清楚如何根据用户角色显示/隐藏导航链接。目前我正在测试用户是否已登录,并且效果很好 - 这是我的代码:

<HyperlinkButton x:Name="AdminLinkButton" Visibility="{Binding User.IsAuthenticated, Source={StaticResource WebContext}, TargetNullValue=false, Converter={StaticResource VisibilityConverter}}" Style="{StaticResource LinkStyle}" NavigateUri="/Admin" TargetName="ContentFrame" Content="{Binding Path=Strings.AdminPageTitle, Source={StaticResource ApplicationResources}}"/>

但是,现在我需要对其进行更改以确保只有在用户处于“管理员”角色时才会显示“管理”按钮。

有人有建议吗?

谢谢,

3 个答案:

答案 0 :(得分:2)

您需要在主页中添加loggedin eventhandler,如下所示: Authentication.LoggedIn + = LoggedIn_Event;

LoggedIn_Event方法中,检查用户是否具有所需角色:

private void LoggedIn_Event(object sender, AuthenticationEventArgs e){
    if (e.User.IsInRole("Required Role")){
        AdminLinkButton.Visibility = System.Windows.Visiblity.Visible;
     }
    else
    {
        AdminLinkButton.Visibility = System.Windows.Visiblity.Collapsed;
    }
}

请记住处理LoggedOut_Event并禁用控件。

答案 1 :(得分:1)

一个选项是通过ConverterParameter传递参数,该参数将识别与确定从转换器返回的结果相关联的用户的类型

ConverterParameter='admin'

避免ConverterParamter强加的字符串限制的另一个选项是存储通过Singleton登录的用户类型或转换器可以查询的其他静态方法,以便知道用户登录了什么,从而返回得到的可见性如果您必须访问XAML中的数据,则可以使用x:Static

ConverterParameter={x:Static namespace:LoggedInUserType}

答案 2 :(得分:0)

有几种方法可以做到这一点,有些方法比其他方式更多:

  1. create one converter完成将用户角色转换为可见性值的整个工作
  2. chain multiple converters(按照答案中的链接),每个转换器执行转换的一部分
  3. 方法#1会让你到达那里,但最终是一个糟糕的方法,因为它导致了许多专门的转换器,可以维持PITA。

    方法#2是更多的工作,但整体上是一种更好,更易于维护的方法。