使用身份验证令牌

时间:2017-06-02 00:22:58

标签: xamarin xamarin.forms

我正在尝试使用身份验证令牌从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;
        }


    }

1 个答案:

答案 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,因为它会很好地抽象出所有内容并使代码保持良好和可测试。