我已经开发了一个WebApi项目,它使用MS标识并向Html/Jquery客户端提供数据。我第一次尝试了Xamarin forms和后续教程。我已经到了可以成功发布登录标准、接收持有者令牌并使用Xam Plugins.Settings存储它的阶段。我可以在以后的请求中很好地使用这个令牌,并且可以很好地接收数据。我正在为如何实现导航而苦苦挣扎,所以当用户单击登录按钮并获得令牌时,应用程序将“重定向”到视图GSMUnitsPage()。目前,用户单击该按钮并正常登录,但它位于相同的登录屏幕上...我已经通过创建一个指向GSMUnitsPage的按钮来证明所有的功能都能正常工作。
登录视图模型:
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:
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:
<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
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());
}
}
发布于 2018-06-09 03:44:40
在LoginCommand上设置Settings.AccessToken后尝试调用App.SetMainPage()方法。(您可能想要公开SetMainPage )
public ICommand LoginCommand
{
get
{
return new Command(async () =>
{
ApiServices apiServices = new ApiServices();
var accesstoken = await apiServices.LoginUserAsync(Email, Password);
Settings.AccessToken = accesstoken;
App.SetMainPage();
});
}
}
https://stackoverflow.com/questions/50763589
复制相似问题