SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET Identity入門

ASP.NET Identityのプロファイル情報のカスタマイズ

ASP.NET Identity入門 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ユーザー情報管理画面の変更

 ここまでで、ユーザークラスと対応するデータベースの変更が完了しました。あとは、追加したプロファイル情報を登録するため、ユーザーの管理ページ(Account\Manage.aspxファイル)に変更を加えます。管理ページにはもともとパスワードの変更を行うための記載がありますので、そちらを参考に「プロファイルの変更」を行う項目を追加します(リスト2)。

リスト2 プロファイル情報変更項目追加(Account\Manage.aspxより)
…

</asp:PlaceHolder>

<asp:PlaceHolder runat="server" ID="changeProfileHolder" Visible="true">
  <div class="form-horizontal">
    <h4>プロファイルの変更フォーム</h4>
    <hr />
    <asp:ValidationSummary runat="server" ShowModelStateErrors="true"
      CssClass="text-danger" ValidationGroup="ChangeProfile" />
    <div class="form-group">
      <asp:Label runat="server" ID="lastNameLabel" AssociatedControlID="lastName"
        CssClass="col-md-2 control-label">姓</asp:Label>
      <div class="col-md-10">
        <asp:TextBox runat="server" ID="lastName" CssClass="form-control" />
      </div>
    </div>
    <div class="form-group">
      <asp:Label runat="server" ID="firstNameLabel" AssociatedControlID="firstName"
        CssClass="col-md-2 control-label">名</asp:Label>
      <div class="col-md-10">
        <asp:TextBox runat="server" ID="firstName" CssClass="form-control" />
      </div>
    </div>
    <div class="form-group">
      <asp:Label runat="server" ID="birthdayLabel" AssociatedControlID="birthday"
        CssClass="col-md-2 control-label">誕生日</asp:Label>
      <div class="col-md-10">
        <asp:TextBox runat="server" ID="birthday" CssClass="form-control" />
        <asp:CompareValidator runat="server" Type="Date" Operator="DataTypeCheck"
          ControlToValidate="birthday" CssClass="text-danger" Display="Dynamic"
          ErrorMessage="日付を入力してください。" ValidationGroup="ChangeProfile" />
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-offset-2 col-md-10">
        <asp:Button runat="server" Text="プロファイルの変更" ValidationGroup="ChangeProfile"
          OnClick="ChangeProfile_Click" CssClass="btn btn-default" />
      </div>
    </div>
  </div>
</asp:PlaceHolder>
</section>

<section id="externalLoginsForm">

…

 ポイントというポイントは特にありませんが、強いて挙げるとすれば、次の2つがあります。

  • 新たにPlaceHolderコントロールを配置して内部に項目を配置すること
  • 検証コントロールによる検証処理がパスワード変更のものとバッティングしないよう、ValidationGroupを別にすること
  • 「プロファイルの変更」ボタンで処理を行うようにすること

 次にコードビハインド側にも変更を加えます。まずはPageのLoadイベントでログイン中のユーザーのプロファイルを表示します(リスト3)。

リスト3 プロファイル情報初期表示(Account\Manage.aspx.csより)
protected void Page_Load()
{
  if (!IsPostBack)
  {
    // レンダリングするセクションを判別します
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    if (HasPassword(manager))
    {
      changePasswordHolder.Visible = true;
    }
    else
    {
      setPassword.Visible = true;
      changePasswordHolder.Visible = false;
    }
    CanRemoveExternalLogins = manager.GetLogins(User.Identity.GetUserId()).Count() > 1;

    // (1)
    // ログインユーザーのプロファイル情報を表示する
    var user = manager.FindById(User.Identity.GetUserId());
    // 姓
    lastName.Text = user.LastName;
    // 名
    firstName.Text = user.FirstName;
    // Eメールアドレス
    email.Text = user.Email;
    // 誕生日
    birthday.Text = user.Birthday.HasValue
      ? user.Birthday.Value.ToString("yyyy/MM/dd")
      : "";

    // 成功メッセージをレンダリングします
    var message = Request.QueryString["m"];
    if (message != null)
    {
      // アクションからクエリ文字列を削除します
      Form.Action = ResolveUrl("~/Account/Manage");

      SuccessMessage =
          message == "ChangePwdSuccess" ? "パスワードが変更されました。"
          : message == "SetPwdSuccess" ? "パスワードが設定されました。"
          : message == "RemoveLoginSuccess" ? "アカウントは削除されました。"
          : message == "ChangeProfileSuccess" ? "プロファイルが更新されました。"   // (2)
          : String.Empty;
      successMessage.Visible = !String.IsNullOrEmpty(SuccessMessage);
    }
  }
}

 ポイントは次のとおりです。

(1)ログインユーザーのプロファイル情報を表示する

 UserManagerクラスの拡張メソッドであるFindByIdメソッドを使い、ログインユーザーの情報を取得します。引数に渡すIDは、前回述べたようにHttpContextのUserプロパティにログインユーザーの情報を設定されているので、その値を使用します。

 ユーザー情報を取得した後は、必要な項目を画面のコントロールに設定します。

(2)プロファイル変更後のメッセージを追加する

 後述するプロファイル更新処理の最後で、クエリ文字列にプロファイル変更処理が完了したことを表す値を設定します。そして、その値を使って完了メッセージを切り替える処理を、パスワード変更などの記述を参考にして追加します。

 最後に、「プロファイルの変更」ボタンの処理を記述します(リスト4)。

リスト4 プロファイルの変更処理(Account\Manage.aspx.csより)
protected void ChangeProfile_Click(object sender, EventArgs e)
{
  if (IsValid)
  {
    // ログイン中のユーザー情報を取得する
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    var user = manager.FindById(User.Identity.GetUserId());   // (1)
    if (user == null)
    {
      throw new InvalidOperationException("ログイン中のユーザー情報が削除されました。");
    }

    // 画面の入力値を設定する
    user.FirstName = firstName.Text;
    user.LastName = lastName.Text;
    var birthdayText = birthday.Text;
    if (string.IsNullOrEmpty(birthdayText))
    {
      user.Birthday = null;
    }
    else
    {
      user.Birthday = DateTime.Parse(birthdayText);
    }

    // ユーザー情報を更新する
    IdentityResult result = manager.Update(user);   // (2)

    if (result.Succeeded)
    {
      Response.Redirect("~/Account/Manage?m=ChangeProfileSuccess");   // (3)
    }
    else
    {
      AddErrors(result);
    }
  }
}

 プロファイル変更処理のポイントは次の3つです。

(1)更新対象ユーザー情報を取得する

 Page.Loadイベントハンドラーと同様に、処理対象となるユーザー情報をUserManagerクラスを使って取得します。画面の入力値はこのユーザー情報オブジェクトに設定します。

(2)ユーザー情報を更新する

 UserManagerクラスの拡張メソッドであるUpdateメソッドを使い、ユーザー情報を更新します。内部ではEFを用いてAspNetUsersテーブルへの更新処理が行われます。

(3)完了メッセージのタイプを設定する

 前述したように、Page.Loadイベントハンドラーで処理完了メッセージを表示するため、表示したいメッセージのタイプをここで設定します。

次のページ
サンプル実行

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET Identity入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7845 2014/07/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング