Сохранить имя пользователя и отобразить на других страницах - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблемы с настройкой способа ввода имени пользователя для отображения на других страницах.Этот код проверяет подлинность и создает новых пользователей на простой таблице Azure.

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;

1 Ответ

0 голосов
/ 23 февраля 2019

Необходимо убедиться, что значение 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...