2017-06-02 37 views
0

我想从使用身份验证令牌的xamarin登录到我的ASP.net应用程序。 这里是我的LoginViewModel.cs使用身份验证令牌从Xamarin登录到ASP.Net应用程序

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()); 
       } 

      }); 
     } 
    } 
} 

isLogin将返回true,但应用程序不导航到仪表板页面的VAR

这里是我的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

检查我已更新LoginAsync函数,我正在获取并存储令牌。条件是如果它获得令牌,则将其存储在变量中。如果成功返回true。我越来越真实,但它没有导航到仪表板页面。 –

回答

0

从你有的代码的外观来看,这个问题看起来像是一个简单的误解事情工作。

首先看来你正在试图实现你自己的MVVM模式,这是好的,除了ViewModels不是页面。你的代码显示你正在试图让你的ViewModel成为一个ContentPage。我唯一的猜测就是你可以访问导航,警报和动作片等东西。

如果您正在实现自己的基本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的页面导航。因为这是一个基本的例子,一切都在构造函数中设置,所以您会注意到这个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,因为它可以很好地抽象出所有东西,并保持代码的良好性和可测试性。

+0

我的登录按钮也绑定loginCommand,我怎样才能将它与Navigate命令同时绑定? –

+0

看来你需要了解更多关于MVVM的知识。请尝试从Xamarin Show观看此[MVVM简介](https://channel9.msdn.com/Shows/XamarinShow/Introduction-to-MVVM)。所提供的代码仅仅是作为它如何工作的基本示例,以及如何使您的导航工作。您的实际代码不需要名为'NavigateCommand'的东西。您可能还想准备一篇我使用[Fody.PropertyChanged](https:// dansiegel)编写的文章。net/post/2017/03/16/writing-cleaner-more-concise-code-with-fody),它将帮助你实现'INotifyPropertyChanged'。 –

相关问题