我如何从viewmodel导航用户到另一个页面

时间:2017-09-17 13:06:31

标签: authentication asp.net-web-api mvvm xamarin.forms asp.net-authorization

当我获得Access令牌并且用户成功登录或用户输入错误的用户名或密码时出现错误消息后,我如何将用户导航到仪表板页面

这是我的登录viewmodel

using RoyalSales.Views;
using System.Windows.Input;
using Xamarin.Forms;
using RoyalSalesAPI.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Android.App;
using Android.Content.Res;
using RoyalSales.Helpers;

namespace RoyalSales.ViewModels
{
    class LoginViewModel
    {
        private APIServices _APIServices = new APIServices();

        public string Username { get; set; }
        public string Password { get; set; }
        public String Message { get; set; }
        public ICommand Logincommand => new Command(async () =>
{
var accesssToken = await _APIServices.LoginAsync(Username, Password);
if (!string.IsNullOrEmpty(accesssToken))
{
Message = "login succeed";

Settings.Username = Username;

Settings.Password = Password;

Settings.AccessToken = accesssToken;
// here i want navigate user to dashboard page 
}
else
{
Message = "wrong username or password";
// here i want show message dialoge to tell user theres an wrong username or 
password 

                                                          }
                                                      });
        public ICommand LogOutcommand
        {
            get
            {
                return new Command( () =>
                {


                        Settings.AccessToken = null;

                });
            }
        }



        public LoginViewModel()
        {
            if (!string.IsNullOrEmpty(Settings.Username))
            {
                Username = Settings.Username;
                Password = Settings.Password;
            }
        }
    }
}

这是我的loginpage.cs

using Javax.Security.Auth;
using RoyalSales.Views;
using Android.Provider;
using RoyalSalesAPI.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using RoyalSales.ViewModels;
using RoyalSales.Helpers;
using Settings = RoyalSales.Helpers.Settings;

namespace RoyalSales
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Login : ContentPage
    {
        public APIServices aPIServices = new APIServices();
        private string accessToken = Settings.AccessToken.ToString();
        public Login()
        {
            InitializeComponent();
            NavigationPage.SetHasNavigationBar(this, false);


        }

        private async void Button_Clicked(object sender, EventArgs e)
        {



        }
    }
}

这是我的loginpage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="RoyalSales.Login"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:viewModels="clr-namespace:RoyalSales.ViewModels;assembly=RoyalSales"
    Title="login page"
    BackgroundColor="#F38906">
    <ContentPage.BindingContext>
        <viewModels:LoginViewModel />
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <StackLayout
            Padding="20"
            Orientation="Vertical"
            Spacing="30">
            <BoxView HeightRequest="20" />
            <Image
                HorizontalOptions="Center"
                Source="almotaheda.png"
                WidthRequest="175" />
            <Label
                FontSize="Large"
                HorizontalOptions="Center"
                Text="slogn"
                TextColor="White" />
            <Frame BackgroundColor="#FBD7AC" HasShadow="False">
                <StackLayout Orientation="Vertical" Spacing="10">
                    <Entry
                        x:Name="UserNameEntry"
                        HeightRequest="40"
                        HorizontalTextAlignment="Center"
                        Placeholder="username"
                        PlaceholderColor="#F38906"
                        Text="{Binding Username}"
                        TextColor="Black" />
                    <Entry
                        x:Name="PasswordEntry"
                        HeightRequest="40"
                        HorizontalTextAlignment="Center"
                        IsPassword="True"
                        Placeholder="Password"
                        PlaceholderColor="#F38906"
                        Text="{Binding Password}"
                        TextColor="Black" />

                </StackLayout>
            </Frame>
            <Label
                FontSize="20"
                Text="{Binding Message}"
                TextColor="#FFFFFF" />
            <Button
                BackgroundColor="White"
                Command="{Binding Logincommand}"
                FontAttributes="Bold"
                FontSize="20"
                HorizontalOptions="FillAndExpand"
                Text="login"
                TextColor="#F38906" 
                Clicked="Button_Clicked"/>
            <BoxView HeightRequest="20" />

        </StackLayout>

    </ContentPage.Content>
</ContentPage>

如果成功登录,请帮助我将用户导航到仪表板页面;如果用户名或密码错误,则帮助我导航到错误消息

1 个答案:

答案 0 :(得分:0)

设置PushAsync

后,您可以使用PushModalAsyncAccessToken

例如:

await App.Current.MainPage.Navigation.PushAsync(new dashboardPage(), true);

要从viewmodel显示警报,您可以使用:

await Application.Current.MainPage.DisplayAlert("Error", "Login message here", "Dismiss");