首页 > 解决方案 > 保存用户名,并显示在其他页面上

问题描述

我很难设置一种方法来捕获用户名以显示在其他页面上。此代码在 azure easy table 上进行身份验证并创建新用户。

public int IsAuth { get; set; }

    //[DataTable("User_Cred")]
    public class User_Cred
    {
        public string id { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }

    }



   private IMobileServiceSyncTable<User_Cred> todoGetTable = App.MobileService.GetSyncTable<User_Cred>();



    private async Task InitLocalStoreAsync()
    {
        if (!App.MobileService.SyncContext.IsInitialized)
        {
            var store = new MobileServiceSQLiteStore("CIS4910C-DB");
            store.DefineTable<User_Cred>();
            await App.MobileService.SyncContext.InitializeAsync(store);
        }
        await SyncAsync();
    }

    private async Task SyncAsync()
    {
        await App.MobileService.SyncContext.PushAsync();
        await todoGetTable.PullAsync("User_Cred", todoGetTable.CreateQuery());
    }



    async public void submitAuthBtn_Click(object sender, RoutedEventArgs e)
    {
        await InitLocalStoreAsync();

        GetAuthentication();

    }

    async public void GetAuthentication()
    {
        try
        {

            //IMobileServiceTable<User_Cred> todoTable = App.MobileService.GetTable<User_Cred>();

            List<User_Cred> items = await todoGetTable
                .Where(User_Cred => User_Cred.Username == textBoxUsername.Text)
                .ToListAsync();

            IsAuth = items.Count();



            // Return a List UI control value back to the form

            foreach (var value in items)
            {

                var dialog = new MessageDialog("Welcome Back  " + value.Username);
                await dialog.ShowAsync();
                this.Frame.Navigate(typeof(home));
            }


            if (IsAuth > 0)
            {
                var dialog = new MessageDialog("You are Authenticated");
                await dialog.ShowAsync();


            }
            else
            {
                var dialog = new MessageDialog(" Account Does Not Exist, please Register to get Started.");
                await dialog.ShowAsync();
            }
        }
        catch (Exception em)
        {
            var dialog = new MessageDialog("An Error Occured: " + em.Message);
            await dialog.ShowAsync();
        }
    }

    async private void submitAuthBtn_Copy_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            User_Cred itemReg = new User_Cred
            {
                Username = textBoxUsername.Text,
                Password = textBoxPassword.Text

            };
            await App.MobileService.GetTable<User_Cred>().InsertAsync(itemReg);
            var dialog = new MessageDialog("Thank you for Registering! Now just hit log in");
            await dialog.ShowAsync();

        }
        catch (Exception em)
        {
            var dialog = new MessageDialog("An Error Occured: " +em.Message);

            await dialog.ShowAsync();
        }
    }

之前问过,我只能得到这个代码的几个突变,这些突变不起作用。任何建议或编辑表示赞赏。这是在主页上,但无法被我下一页上的下一个代码块读取。

public string globalUserLabel;

public void SaveSetting(string userLabel, string userNamelabel)
{
    globalUserLabel = userLabel;
    ApplicationDataContainer localSettings =
    ApplicationData.Current.LocalSettings;
    //Saving your setting  
    localSettings.Values[userLabel] = textBoxUsername.Text;
}

下一页有

public home()
{
    this.InitializeComponent();
    UserNameLabelBox.Text = ReadSetting(MainPage.globalUserLabel );
}



private string ReadSetting(string userLabel)
{
    Windows.Storage.ApplicationDataContainer localSettings =
    Windows.Storage.ApplicationData.Current.LocalSettings;
    //Reading and returning your setting value
    var value = localSettings.Values[userLabel];
    if (value != null)
        return value.ToString();
    else
        return userLabel;

标签: c#azureuwp

解决方案


您需要确保userLabel存储值时的值与尝试检索值时的值相同。通常建议为此使用const string字段。更好的是,将所有访问设置的代码重构为单独的类。您可以为单个设置创建属性并将其名称用作设置的键:

public class AppSettings
{
   public string UserName
   {
      get => ReadSetting(null);
      set => SaveSetting(value);
   }

   private string ReadSetting(string defaultValue,
                             [CallerMemberName]string settingKey = null)
   {
       var localSettings = ApplicationData.Current.LocalSettings;
       if (localSettings.Values.ContainsKey(settingKey))
       {
            return (string)settings.Values[settingKey];
       }
       else
       {
            return defaultValue;
       }
   }

   private string SaveSetting(string value, 
                             [CallerMemberName]string settingKey = null)
   {
       ApplicationData.Current.LocalSettings.Values[settingKey] = value;
   }
}

现在您将AppSettings在您的代码中使用:

public void SaveSetting(string userLabel, string userNamelabel)
{
    var appSettings = new AppSettings();
    appSettings.UserName = textBoxUsername.Text;
}


private string ReadSetting(string userLabel)
{
    var appSettings = new AppSettings();
    return appSettings.UserName ?? "User not signed in";
}

进一步解释代码 -[CallerMemberName]是一个特殊的属性,在编译过程中填写,将包含方法调用者的名称,在这种情况下它将是属性名称。

此外,AppSettings它现在是一个简单的服务,可以用作单例,您可以从中提取一个接口并使用 IoC 容器将其注入到任何需要使用它的地方。


推荐阅读