首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >登录成功时的Xamarin表单导航

登录成功时的Xamarin表单导航
EN

Stack Overflow用户
提问于 2018-06-08 23:09:58
回答 1查看 253关注 0票数 -1

我已经开发了一个WebApi项目,它使用MS标识并向Html/Jquery客户端提供数据。我第一次尝试了Xamarin forms和后续教程。我已经到了可以成功发布登录标准、接收持有者令牌并使用Xam Plugins.Settings存储它的阶段。我可以在以后的请求中很好地使用这个令牌,并且可以很好地接收数据。我正在为如何实现导航而苦苦挣扎,所以当用户单击登录按钮并获得令牌时,应用程序将“重定向”到视图GSMUnitsPage()。目前,用户单击该按钮并正常登录,但它位于相同的登录屏幕上...我已经通过创建一个指向GSMUnitsPage的按钮来证明所有的功能都能正常工作。

登录视图模型:

代码语言:javascript
复制
class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public ICommand LoginCommand
    {
        get
        {
            return new Command(async () =>
            {
                ApiServices apiServices = new ApiServices();
                var accesstoken = await apiServices.LoginUserAsync(Email, Password);
                Settings.AccessToken = accesstoken;
            });
        }

    }

    public LoginViewModel()
    {
        Email = Settings.Username;
        Password = Settings.Password;
    }

}

登录Api:

代码语言:javascript
复制
public async Task<string> LoginUserAsync(string email, string password)
{
    var client = new HttpClient();

    var keyValues = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("username", email),
        new KeyValuePair<string, string>("password", password),
        new KeyValuePair<string, string>("grant_type", "password")
    };

    var request = new HttpRequestMessage(
        HttpMethod.Post, "linktotoken");

    request.Content = new FormUrlEncodedContent(keyValues);
    var reponse = await client.SendAsync(request);

    var jwt = await reponse.Content.ReadAsStringAsync();
    JObject jwtDyanmic = JsonConvert.DeserializeObject<dynamic>(jwt);

    var accessToken = jwtDyanmic.Value<string>("access_token");
    var accessTokenExpiration = jwtDyanmic.Value<DateTime>(".expires");
    Settings.AccessTokenExpiration = accessTokenExpiration;

    Debug.WriteLine(jwt);

    return accessToken;
}

LoginPage.xaml:

代码语言:javascript
复制
<ContentPage.BindingContext>
<vm:LoginViewModel/>
</ContentPage.BindingContext>


<StackLayout VerticalOptions="Center">
<Entry Text="{Binding Email}" />
<Entry Text="{Binding Password}" />
<Button Command="{Binding LoginCommand}" Text="Login/Signin" />
</StackLayout>

App.xaml.cs

代码语言:javascript
复制
public App ()
{
    InitializeComponent();

    SetMainPage();
}

private void SetMainPage()
{
    if (!string.IsNullOrEmpty(Settings.AccessToken))
    {
        if (DateTime.UtcNow.AddHours(1) > Settings.AccessTokenExpiration)
        {
            var vm = new LoginViewModel();
            vm.LoginCommand.Execute(null);
        }
        MainPage = new NavigationPage(new GSMUnitsPage());
    }
    else if(!string.IsNullOrEmpty(Settings.Username) && !string.IsNullOrEmpty(Settings.Password))
    {
        MainPage = new NavigationPage(new LoginPage());
    }
    else
    {
        MainPage = new NavigationPage(new RegisterPage());
    }
}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50763589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档