我正在尝试使用身份验证令牌从xamarin登录我的ASP.net应用程序。 这是我的 LoginViewModel.cs
public class LoginViewModel : ContentPage
{
private ApiServices _apiServices = new ApiServices();
public string Username { get; set; }
public string Password { get; set; }
public ICommand LoginCommand
{
get
{
return new Command(async() =>
{
var isLogin = await _apiServices.LoginAsync(Username, Password);
if (isLogin)
{
await Navigation.PushModalAsync(new Dashboard());
}
});
}
}
}
var isLogin 返回true但应用程序未导航到Dashboard页面
这是我的 LoginAsync 功能
public async Task<bool> LoginAsync(string userName, string password)
{
var keyValues = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("username",userName),
new KeyValuePair<string, string>("password",password),
new KeyValuePair<string, string>("grant_type","password"),
};
var request = new HttpRequestMessage(HttpMethod.Post, "http://epolleasy.azurewebsites.net/Token");
request.Content = new FormUrlEncodedContent(keyValues);
var client = new HttpClient();
var response = await client.SendAsync(request);
var jwt = await response.Content.ReadAsStringAsync();
JObject jwtDynamic = JsonConvert.DeserializeObject<dynamic>(jwt);
var accessToken = jwtDynamic.Value<string>("access_token"); //variable for acsess_token
//Debug.WriteLine(jwt);
if (!string.IsNullOrEmpty(accessToken))
{
return response.IsSuccessStatusCode;
}
else
{
return response.IsSuccessStatusCode;
}
}
答案 0 :(得分:0)
从您所拥有的代码的外观来看,问题看起来像是对事情如何运作的简单误解。
首先,您似乎正在尝试实现自己的MVVM模式,除了ViewModel不是页面之外。您的代码显示您正在尝试将ViewModel设置为ContentPage。我唯一的猜测就是它可以访问导航,警报和ActionSheets等内容。
如果您正在实施自己的基本MVVM,可能需要做出一些牺牲才能使事情发挥作用。在Xamarin Forms中,特别是导航等内容通常需要了解您要从哪里导航。作为基本示例,请考虑以下我们要从ViewA导航到ViewB的位置
<强> ViewAViewModel.cs 强>
public class ViewAViewModel
{
private Page _page { get; }
public ViewAViewModel(Page page)
{
_page = page;
NavigateCommand = new Command(OnNavigateCommandExecuted);
}
public Command NavigateCommand { get; }
private void OnNavigateCommandExecuted() =>
_page.Navigation.PushModalAsync(new ViewB());
}
您会注意到我的ViewModel在这种情况下会接受一个Page,以便它可以从使用ViewModel的Page中正确导航。因为这是一个基本的例子,所有内容都在构造函数中设置,你会注意到这个ViewModel不需要从任何其他类继承,也不会实现INotifyPropertyChanged
。实际应用程序中的ViewModel可能至少需要实现INotifyPropertyChanged
。
<强> ViewA.xaml 强>
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BasicMvvm.Views.ViewA">
<Button Text="Navigate"
HorizontalOptions="Center"
VerticalOptions="Center"
Command="{Binding NavigateCommand}" />
</ContentPage>
<强> ViewA.xaml.cs 强>
public partial class ViewA : ContentPage
{
public ViewA()
{
InitializeComponent();
BindingContext = new ViewAViewModel(this);
}
}
现在说你真的更好地使用实际的MVVM框架。我建议你看一下Prism,因为它会很好地抽象出所有内容并使代码保持良好和可测试。