对于我的 Xamarin.Forms 应用程序,我正在寻找一种方法来检查用户是否具有访问页面的正确角色/身份验证状态。我知道 Angular 有路由守卫,可以重复用于不同的路由来检查身份验证状态。 Xamarin.Forms 中有类似的东西吗?
最佳答案
这是一个示例,展示了如何根据用户的登录状态控制页面的可见性或导航。
默认情况下,Shell 最初总是显示 AppShell.xaml
中定义的第一个元素。 ,在这种情况下,它将是 Login.xaml
页。
在下面的示例中,“Page3”最初是可见的,因为默认情况下( Isvisible=true
),而“Page2”仅在可绑定(bind)属性 IsLogged
时才可见。是 true
.
IsLogged_PropertyChanged()
中处理用户登录/注销时的任何逻辑。事件。使用 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/