c# - 您如何根据登录状态/角色限制/控制用户可以访问的导航路线?

标签 c# xaml xamarin xamarin.forms xamarin.forms.shell

对于我的 Xamarin.Forms 应用程序,我正在寻找一种方法来检查用户是否具有访问页面的正确角色/身份验证状态。我知道 Angular 有路由守卫,可以重复用于不同的路由来检查身份验证状态。 Xamarin.Forms 中有类似的东西吗?

最佳答案

这是一个示例,展示了如何根据用户的登录状态控制页面的可见性或导航。
默认情况下,Shell 最初总是显示 AppShell.xaml 中定义的第一个元素。 ,在这种情况下,它将是 Login.xaml页。
在下面的示例中,“Page3”最初是可见的,因为默认情况下( Isvisible=true ),而“Page2”仅在可绑定(bind)属性 IsLogged 时才可见。是 true .

  • 您可以在 IsLogged_PropertyChanged() 中处理用户登录/注销时的任何逻辑。事件。
  • 如果您想要多个/特定或基于页面的角色,您可以随时创建/定义/设计您的角色,在绑定(bind)中使用它们,引发并使用其属性更改事件来执行操作。

  • 使用 FlyoutItem
    AppShell.xaml
    <Shell Shell.FlyoutBehavior="Disabled"..>
       <FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
            <Tab>
                <ShellContent Title="Login" Route="Login">
                    <local:Login />
                </ShellContent>
    
                <ShellContent Title="Page2" Route="Page2"
                    ContentTemplate="{DataTemplate local:Page2}"
                    IsVisible="{Binding IsLogged}"/>
    
                <ShellContent Title="Page3" Route="Page3"
                    ContentTemplate="{DataTemplate local:Page3}"/>
            </Tab>
        </FlyoutItem>
    
    AppShell.xaml.cs
    public bool IsLogged
    {
        get => (bool)GetValue(IsLoggedProperty);
        set => SetValue(IsLoggedProperty, value);
    }
    
    public static readonly BindableProperty IsLoggedProperty =
        BindableProperty.Create("IsLogged", typeof(bool), typeof(AppShell), false, propertyChanged: IsLogged_PropertyChanged);
    
    private static void IsLogged_PropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
    //handle log in/log out event
        if ((bool) newValue)
           //user just logged in logic
        else
          //user just logged out logic
    }
    
    登录.xaml
    <StackLayout>
        <Label
            FontSize="45"
            HorizontalOptions="FillAndExpand"
            Text="Login Page" />
        <Button Clicked="Button_Clicked" Text="Log In" />
    </StackLayout>
    
    登录.xaml.cs
    private async void Button_Clicked(object sender, System.EventArgs e)
    {
        IsVisible = false;                          //hide login page
        //Trigger the binding to show pages previously hidden
        (Shell.Current as AppShell).IsLogged = true;
        await Shell.Current.GoToAsync("//Page2");   //navigate to main page (next after log)
                                                   //Enable the flyout: hamburger button
        Shell.Current.FlyoutBehavior = FlyoutBehavior.Flyout;  
    }
    

    与标签相同的事情
    在此示例中,“符号”底部选项卡对于属于底部选项卡“字母”的上部选项卡“B”将不可见,直到用户登录,其余底部选项卡最初将可见。
    AppShell.xaml
    <TabBar>
        <ShellContent Title="Login" Route="Login">
            <local:Login />
        </ShellContent>
    
        <Tab Title="Letters">
            <ShellContent
                Title="A"
                ContentTemplate="{DataTemplate local:Page1}"
                Route="Page1" />
    
            <ShellContent
                Title="B"
                ContentTemplate="{DataTemplate local:Page2}"
                IsVisible="{Binding IsLogged}"
                Route="Page2" />
    
            <ShellContent
                Title="C"
                ContentTemplate="{DataTemplate local:Page3}"
                Route="Page3" />
        </Tab>
    
        <Tab Title="Digits">
            <ShellContent
                Title="100"
                ContentTemplate="{DataTemplate local:Page4}"
                Route="Page4" />
        </Tab>
    
        <Tab Title="Symbols" IsVisible="{Binding IsLogged}">
            <ShellContent
                Title="!"
                ContentTemplate="{DataTemplate local:Page5}"
                Route="Page5" />
        </Tab>
    </TabBar>
    
    编辑
    您可能还想添加 Shell.NavBarIsVisible="False"Shell.TabBarIsVisible="false"在 Tabbar 的情况下,到 LoginPage 分别隐藏导航栏和隐藏底部标签栏。

    关于c# - 您如何根据登录状态/角色限制/控制用户可以访问的导航路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65186262/

    相关文章:

    c# - MVVM 将嵌套 subview 连接到 subview 模型

    c# - VS2012 是一个 BSOD 原因

    c# - 列表框选择模式在 WPF 中不起作用

    c# - 根据文本需要多少空间自动设置 Label HeightRequest

    asp.net - 尝试向服务器发送 byte[] 时,Xamarin 中出现 "Cannot access a disposedObject"异常

    c# - Swashbuckle MapType<Type> 不适用于参数

    wpf - WPF 中的 ResourceDictionary 中没有键的 DataTemplate

    xaml - Windows8 ListView 和项目之间的空间

    ios - Xamarin 表单(在 iOS 上运行): Unable to file a storyboard file when building

    C# 3.5 协方差问题?