2017-08-23 22 views
1

私はCapstoneコース用にUWPモバイルアプリケーションを開発しています。現時点では、Azure SQLデータベースに保存されたテーブルにユーザを認証するためのコードが書かれています。私が必要とするのは、ユーザー名をアプリケーションの他の部分に表示するか、データベースを検索してそのユーザー名で物事だけをプルするために使用できるものに入力されたユーザー名を保存することです。C# - UWP - ログイン画面に入力するとユーザー名を保存します

私はセッションクラスに関していくつかのブログなどを見てきましたが、ここでそれを使用しているようです。他の助けがあれば幸いです。 SQL Serverを使用していないため、App.Xaml.cs.に接続文字列があります。

public static MobileServiceClient MobileService = new 
MobileServiceClient("http://tale-webapp.azurewebsites.net"); 

私の現在のログインページが以下の通りです:

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    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("Tale-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 == UserNameEnter.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(UserHome)); 
      } 


      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 = UserNameEnter.Text, 
       Password = PWEnter.Text 

      }; 
      await App.MobileService.GetTable<User_Cred>().InsertAsync(itemReg); 
      var dialog = new MessageDialog("Thank you for Registering! Lets begin"); 
      await dialog.ShowAsync(); 

     } 
     catch (Exception em) 
     { 
      var dialog = new MessageDialog("An Error Occured: User Nname 
Already exists."); 
      await dialog.ShowAsync(); 
     } 
    } 




} 

}

試した後、私はまだ運を持っていないです、コードがポイントに動作しているようです。

これは私が私のメインページに配置したものである(ログインしている)

private void saveSetting(string userLabel, string userNamelabel) 
    { 
     Windows.Storage.ApplicationDataContainer localSettings = 
Windows.Storage.ApplicationData.Current.LocalSettings; 
     //Saving your setting 
     localSettings.Values[userLabel] = UserNameEnter.Text; 
    } 

私の次のページに移動すると、これは私が置かれているコードです。

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; 

     UserNameLabelBox.Text = readSetting(userLabel); 

    } 

問題を約UserNameLabelBox(テキストボックス)は緑のsqigglyラインを持っており、VSが到達不能コードが検出されたと言うことです。アプリを実行すると、そのボックスには何も表示されません。

私は答えを適用したので、私はエラーに遭遇します。ログインページの後にロードされる2番目のページで、UserNameLabelBox.Text = readSetting(userNameLabel)を追加すると、赤い行エラーが表示されます。現在のコンテキストに存在しないことを示すuserNameLabelに赤い行が表示されます。

要約すると:ログインページでは、

private void saveSetting(string userLabel, string userNameLabel) 
    { 
     Windows.Storage.ApplicationDataContainer localSettings = 
Windows.Storage.ApplicationData.Current.LocalSettings; 
     //Saving your setting 
     localSettings.Values[userLabel] = UserNameEnter.Text; 
    } 

ログインが成功した後の次のページで、

public sealed partial class UserHome : Page 
{ 
    public UserHome() 
    { 
     this.InitializeComponent(); 

     UserNameLabelBox.Text = readSetting(userLabel); 
    } 

エラーが(上記の)発生した場所それがここにある

private void HyperlinkButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.Frame.Navigate(typeof(UserJournalPage)); 
    } 

    private void aboutUs_Click(object sender, RoutedEventArgs e) 
    { 
     this.Frame.Navigate(typeof(AboutUs)); 
    } 


    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; 

答えて

2

私はあなたが複数の方法でこれを行うことができます確信しているが、最も簡単なの一つは、アプリケーションの設定でユーザー名を格納するだろう(Windows.Storage.ApplicationData.Current.LocalSettings)

次の例のようにこれを使用することができます。私はまた、アプリケーションの設定で、それを格納する前に暗号化するユーザー名をお勧めします

Windows.Storage.ApplicationDataContainer localSettings = 
    Windows.Storage.ApplicationData.Current.LocalSettings; 
//setting value 
localSettings.Values["userName"] = "Username Value"; 

//Getting the setting value 
string value = localSettings.Values["userName"].toString(); 

More Info from MSDN


編集

例コードサンプル:

//Call this from your code with the setting name and the value that you want to store in it 
private void saveSetting(string settingName,string settingValue){ 
    Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
    //Saving your setting 
    localSettings.Values[settingName] = settingValue; 
} 

//Retrieve your setting value 
private string readSetting(string settingName){ 
    Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
    //Reading and returning your setting value 
    var value=localSettings.Values[settingName]; 
    if(value!=null) 
    return value.toString(); 
    else 
    return ""; 
} 

だから、特定のユーザーのログインが成功した後、あなたはsaveSetting()メソッドを呼び出すことにより、ユーザー名を保存することができます次のページの後半では、readSetting()方法。あなたはこのような何か書く必要がある、あなたのTextBlockに値を設定するために

TextBlockName.Text=readSetting("YourSettingName"); 

は、この情報がお役に立てば幸いです。あなたのコードを見た後..私はあなたのための間違った何が起こっているか確認している ...

enter image description here あなたがここで間違ってやっている2つのことがあります:


EDIT 2

は、
  1. UserNameLabelBox.Textが割り当てられますが、これは更新されません。これは、関数が設定に格納されている値を返し、コントロールが呼び出し元のメソッドに戻るためです。したがってUserNameLabelBox.Text = readSetting(userLabel)が呼び出されることはありません。

return文は、それが表示され、リターンは呼び出し元のメソッド

に制御する方法の実行を終了詳細を知るために、このReturn Statement Documentationを通過してください。単純にreadSetting()メソッドからUserNameLabelBox.Text = readSetting(userLabel);を削除し、

2.Youは...それはrecursionであり、あなたのコードは無限readSetting()


ソリューションメソッドを呼び出します。その中から、方法自体呼び出していますクラスのコンストラクタに入れます(たとえば、MainPage()はMainPage.xaml.csのコンストラクタです)。クラスの新しいインスタンスが作成されると、テキストブロックに値が渡されます。

例:

public YourPageThatComesAfterLogin() 
{ 
    this.InitializeComponent(); 
    UserNameLabelBox.Text = readSetting(userLabel); 
} 
+0

私は助けに感謝が、これは、私は完全に混乱しています。私がこれを入力すると、ログインが成功した後に来るXamlページのテキストブロックにこれをどうやって入れるのかわからないのですが、どこにでもエラーがあります。 – CHernandez

+0

私はあなたがC#のコードを間違って配置していると思います。私は編集を行いました。うまくいけば、これはあなたがこれを少し良く理解するのに役立ちます。また、設定が保存されると、アプリケーション全体でアクセス可能になります。 – Pratyay

+0

編集はエラーを見なかったので役に立ちましたが、文字列をテキストブロックに呼び出すときにエラーが表示されました。私がコールセクションに入れようとすると、何も表示されません。リターンを空のままにしておくか、設定名をその中に置きますか?また、入力したい値がユーザー入力の値であれば、その名前を入力としますか?例、userName = userNameEnter.text userNameまたはuserNameEnter.textを入れますか? – CHernandez

関連する問題