2017-03-03 6 views
0

私は.net mvc認証を使用しています。私は名前のようなAspNetUsersテーブルにいくつかの異なるフィールドを追加しました。ユーザーが最初の名前を入力することを含めてシステムに登録すると、そのテーブルに入力され、正常に動作します。AspNetUsersテーブルからカスタムプロパティを追加する.net mvc

私がしたいのは、/ Manage/Indexで編集可能なAspNetUsersのフィールドのいくつか(例:firstname、lastname)を作ることです。/Manage/Indexは、以下のIndexViewModelを使用します。

public class IndexViewModel 
    { 
     public bool HasPassword { get; set; } 
     public IList<UserLoginInfo> Logins { get; set; } 
     public string PhoneNumber { get; set; } 
     public bool TwoFactor { get; set; } 
     public bool BrowserRemembered { get; set; } 
    } 

コントローラのアクションは次のとおりです。

public async Task<ActionResult> Index(ManageMessageId? message) 
    { 
    ViewBag.StatusMessage = message == ManageMessageId.ChangePasswordSuccess ? 

      var userId = User.Identity.GetUserId(); 
      var model = new IndexViewModel 
      { 
       HasPassword = HasPassword(), 
       PhoneNumber = await UserManager.GetPhoneNumberAsync(userId), 
       TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId), 
       Logins = await UserManager.GetLoginsAsync(userId), 
       BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId) 
      }; 
      return View(model); 
     } 

は、私の質問は以下のとおりです。

  1. 私はちょうどそこになど、姓、私自身のChangeDetailsビューとコントローラと変更FIRSTNAMEを作成する必要がありますか?

  2. @model IndexViewModelを使用して管理/インデックスを使用する - 私はそのIndexViewModelでAspNetUserテーブルにアクセスする方法が完全にはわかりません - userIdが利用可能な場合、私はそのIDでテーブルをクエリできます。

  3. これは管理/インデックスで簡単に行うことができますが、私はそれを必要以上に難しくしています。

ありがとう。あなたはModels\IdentityModels.csApplicationUserクラスに追加のプロパティを追加した場合

答えて

0

、あなたはそうのようなIndexViewModel.csを変更することができます。

public class IndexViewModel 
{ 
    public bool HasPassword { get; set; } 
    public IList<UserLoginInfo> Logins { get; set; } 
    public string PhoneNumber { get; set; } 
    public bool TwoFactor { get; set; } 
    public bool BrowserRemembered { get; set; } 
    public ApplicationUser CurrentUser { get; set; } 
} 

その後、ManageController.csIndexアクションメソッドでは、電流のApplicationUser参照を取得しますユーザーはUserManagerを使用しています。

var userId = User.Identity.GetUserId(); 
var model = new IndexViewModel 
{ 
    HasPassword = HasPassword(), 
    PhoneNumber = await UserManager.GetPhoneNumberAsync(userId), 
    TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId), 
    Logins = await UserManager.GetLoginsAsync(userId), 
    BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId), 
    CurrentUser = await UserManager.FindByIdAsync(userId) 
}; 
return View(model); 
+0

これは素晴らしいことです。 Jaimeに感謝します。新しいIndexViewModelのプロパティが設定されているときにasync/awaitがなぜ存在するのかを説明するだけですか? – Mike

+0

'FindByIdAsync'メソッドは、メインアプリケーションとは別のスレッド上で実行されるため、' async/await'パターンを使用してタスクを実行しますが、現在の実行スレッドをロックしません。詳細については、[asyncとawaitを使用した非同期プログラミング](https://msdn.microsoft.com/en-us/library/mt674882.aspx) –

+0

ありがとうございます。最後の1つの質問。ユーザがAspNetUserのいくつかのフィールドの詳細を変更すると終了します。私は、そのデータをバインドし、AspNetUserテーブルに配置するmanagecontrollerでpostメソッドを作成する必要がありますか? – Mike

関連する問題