カスタムユーザーデータの保存
ここまでの段階で、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>
InsertParameterのShippingAddress、ShippingCity、ShippingState、ShippingZipの値は、今回の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のユーザーテーブルに対する外部キーを備えたデータベーステーブルに保存しました。
それでは、ハッピープログラミング!

[BillingCity], [BillingState], [BillingZip], [ShippingAddress],