2017-06-02 18 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

あなたが持っているコードの外観から、問題は単純な誤解のように見えます物事が働く。

まず、ViewModelsはページではないことを除いて、自分のMVVMパターンを実装しようとしているようです。あなたのコードは、ViewModelをContentPageにしようとしていることを示しています。私の推測では、Navigation、Alerts、ActionSheetsのようなものにアクセスすることができるということだけです。

独自の基本的なMVVMを実装している場合は、動作させるためにいくつかの犠牲をする必要があります。 Xamarinフォームでは、ナビゲーションのようなものは、一般的にどこからナビゲートしたいのかを理解する必要があります。基本的なサンプルとして、私たちは、あなたがこのケースで私のViewModelはページを受け入れることに気づくでしょう

ViewAViewModel.cs ViewAからViewBに

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を実装する必要があります。実際のMVVMフレームワークを使用して、あなたが本当にオフに優れていると述べた

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

今。 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'を実装するのに役立ちます。 –