SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

japan.internet.com翻訳記事

CreateUserWizardコントロールのマルチステッププロセス化

新規アカウントを作成するCreateUserWizardのカスタマイズ

カスタムユーザーデータの保存

 ここまでの段階で、CreateUserWizardコントロールをカスタマイズして、請求先と発送先の情報をユーザーに尋ねることができるようになりました。しかし、既定のCreateUserWizardコントロールは、既定のユーザー属性(ユーザー名、メールアドレス、パスワード、秘密の質問とその答えなど)を備えた新規ユーザーをメンバシップシステムに追加するだけです。SqlMembershipProviderは、これらの基本的なユーザー属性を格納するデータベーステーブルをあらかじめ用意しています。追加のユーザー属性を保存するためには、ASP.NET 2.0のプロファイルシステムを使用するか、この追加データを格納する独自のデータベーステーブルを作成する必要があります。今回は、後者の方法を使用します。

 CreateUserWizardで収集した追加情報を保存するために、今回のサンプルプロジェクトのSQL Server Expressデータベース(「App_Data」フォルダの「ASPNETDB.MDF」)内に「UserAddresses」という名前のテーブルを作成しました。このテーブルのスキーマは次のようになっています。

 「UserAddresses」テーブルのUserId列は、このテーブルの主キーであり、「aspnet_Users」テーブル内のユーザーを指す外部キーでもあります。この追加データを挿入するには、CreateUserWizardStepの内側のどこかでSqlDataSourceサーバーコントロールを使用して、メンバシップシステム内にユーザーアカウントが作成された後にカスタムのユーザー属性を挿入します(SqlDataSourceコントロールの詳細については、Scott Mitchellの記事シリーズ『Accessing and Updating Data in ASP.NET 2.0』を参照してください)。

 次のマークアップでは、InsertCommandプロパティを使用して「UserAddresses」テーブルに新規レコードを追加するSqlDataSourceコントロールを追加しています。

<asp:SqlDataSource ID="InsertExtraInfo" runat="server"
  ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString1 %>"
  InsertCommand="INSERT INTO [UserAddresses] ([UserId], [BillingAddress], 
[BillingCity], [BillingState], [BillingZip], [ShippingAddress], 
[ShippingCity], [ShippingState], [ShippingZip]) VALUES (@UserId, 
@BillingAddress, @BillingCity, @BillingState, @BillingZip, 
@ShippingAddress, @ShippingCity, @ShippingState, @ShippingZip)"
  ProviderName="<%$ ConnectionStrings:ASPNETDBConnectionString1.ProviderName %>">
  <InsertParameters>
    <asp:ControlParameter Name="BillingAddress" Type="String"
      ControlID="BillingAddress" PropertyName="Text" />
    <asp:ControlParameter Name="BillingCity" Type="String"
      ControlID="BillingCity" PropertyName="Text" />
    <asp:ControlParameter Name="BillingState" Type="String"
      ControlID="BillingState" PropertyName="Text" />
    <asp:ControlParameter Name="BillingZip" Type="String"
      ControlID="BillingZip" PropertyName="Text" />
    <asp:ControlParameter Name="ShippingAddress" Type="String"
      ControlID="ShippingAddress" PropertyName="Text" />
    <asp:ControlParameter Name="ShippingCity" Type="String"
      ControlID="ShippingCity" PropertyName="Text" />
    <asp:ControlParameter Name="ShippingState" Type="String"
      ControlID="ShippingState" PropertyName="Text" />
    <asp:ControlParameter Name="ShippingZip" Type="String"
      ControlID="ShippingZip" PropertyName="Text" />
  </InsertParameters>
</asp:SqlDataSource>

 InsertParameterShippingAddressShippingCityShippingStateShippingZipの値は、今回のCreateUserWizardの第2ステップのコントロールから取得されます(ここでは説明を省略します)。

 ユーザーアカウントがメンバシップシステムに追加されると、CreateUserWizardのOnCreatedUserイベントが発生します。そこで、このイベントに関するイベントハンドラを作成し、SqlDataSourceのInsert()メソッドを呼び出します。これにより、ユーザーアカウントがメンバシップシステムに追加された後に、カスタムのユーザー属性が「UserAddresses」テーブルに追加されます。

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
  TextBox UserNameTextBox =
    (TextBox)CreateUserWizardStep2.ContentTemplateContainer
      .FindControl("UserName");
  SqlDataSource DataSource =
    (SqlDataSource)CreateUserWizardStep2.ContentTemplateContainer
      .FindControl("InsertExtraInfo");

  MembershipUser User = Membership.GetUser(UserNameTextBox.Text);
  object UserGUID = User.ProviderUserKey;

  DataSource.InsertParameters.Add("UserId", UserGUID.ToString());
  DataSource.Insert();
}

 このイベントハンドラでは、CreateUserWizardStep2ステップから新しいユーザーのユーザー名を取得し、それをMembership.GetUser(userName)メソッドに渡しています。Membership.GetUser(userName)メソッドは、指定されたユーザーに関するUserIdなどの情報を返します。その後、メンバシップユーザーのUserIdをSqlDataSourceコントロールのUserIdパラメータに割り当て、「UserAddresses」テーブルへのレコードの挿入を実行します。

 お好みの色を追加してプロジェクトを実行すると、次の図のようなフォームが表示されます。

 各ステップを順にたどったり、前のステップに戻ったりすることができ、フィールドに必要な情報を入力してウィザードを完了すると、新規ユーザーを作成することができます。ユーザーが作成できたら、データベーステーブルを調べて、「UserAddresses」テーブルに新しいレコードが追加されていることを確認しましょう。

まとめ

 今回の記事では、ASP.NET 2.0のCreateUserWizardサーバーコントロールをカスタマイズする方法を順を追って説明しました。具体的には、請求先情報と発送先情報を収集する2つの独立したステップを作成しました。さらに、ユーザーの入力内容を収集して、ASP.NETのユーザーテーブルに対する外部キーを備えたデータベーステーブルに保存しました。

 それでは、ハッピープログラミング!

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

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

Erich Peterson(Erich Peterson)

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/521 2006/08/22 00:00

イベント

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

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

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

メールバックナンバー