CreateUserWizardコントロールのマルチステッププロセス化はじめに「より機能性と応答性に優れたユーザーフレンドリーなWebアプリケーションを作成する」という目標の実現に向けて、ASP.NET 2.0では、新しいサーバーコントロールが数多く追加されました。その1つがCreateUserWizardコントロールであり、これが今回の記事のテーマです。このコントロールになじみがない方のために簡単に説明しておきますが、CreateUserWizardはその名が示すとおり、ASP.NET 2.0のメンバシップシステムで新規ユーザーアカウントを作成するためのウィザードインターフェイスを実現するものです(Wizardコントロールとメンバシップシステムの詳細については、Scott Mitchellの記事『Creating a Step-by-Step User Interface with the ASP.NET 2.0 Wizard Control』と『Examining ASP.NET 2.0’s Membership, Roles, and Profile』を参照してください)。 この記事では、CreateUserWizardをマルチステッププロセスにカスタマイズする手順を紹介します。項目数の多いデータ入力フォームの場合は、いくつかのステップに分けるとユーザーの抵抗感が減り、プロセスを最後までやり遂げやすくなります。今回作成するプロセスのステップは次のとおりです。
では本題に入りましょう。 準備 この記事を深く理解し、サンプルコードを自分で試してみるためには、少なくとも、組み込みのメンバシッププロバイダ( CreateUserWizardの基本CreateUserWizardコントロールはWizardコントロールを拡張したもので、マルチステップのユーザー登録プロセスを作成するのに最適のコントロールです。しかし、次の図を見ても分かるように、既定のCreateUserWizardコントロールをページに配置しただけでは、実際のWebアプリケーションでは使い物になりません。 ![]() このように、入力するフィールドがUser Name(ユーザー名)、Password(パスワード)、E-mail(メールアドレス)、Secret Question(秘密の質問)、Secret Answer(秘密の質問の答え)しかないのです。しかし幸いなことに、このコントロールはテンプレート化されていて、レイアウトを変更したり、入力するフィールドの数を増やしたり、マルチステッププロセスに作り変えたりすることができます。このコントロールの最も素晴らしいところは、メンバシッププロバイダとのシームレスな統合を実現することです(詳しくは後述)。 CreateUserWizardコントロールを最初にページ上に配置したときに生成されるマークアップを次に示します。 <asp:CreateUserWizard ID="CreateUserWizard1" runat="server"> <WizardSteps> <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"> </asp:CreateUserWizardStep> <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server"> </asp:CompleteWizardStep> </WizardSteps> </asp:CreateUserWizard> この宣言から、CreateUserWizardコントロールのカスタマイズ方法が想像できるのではないでしょうか。まず <asp:CreateUserWizardStep ID="CreateWizardStep1" runat="server"> </asp:CreateUserWizardStep> このステップは、既定では、先ほど紹介したフィールド群(User Name、Passwordなど)を表示します。その後、[Create User]ボタンがクリックされると、そのユーザーを表す適切なレコードをSQL Expressデータベース内に作成します。最後に、次のように宣言されたステップがあります。 <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server"> </asp:CompleteWizardStep> このステップは、既定では、「Your account has been successfully created(アカウントが正常に作成されました)」というメッセージと[Continue]ボタンを表示します。[Continue]ボタンがクリックされると、CreateUserWizardコントロールの CreateUserWizardコントロールのカスタマイズ それでは、ウィザード内のステップをカスタマイズする方法を見ていきましょう。 <asp:WizardStep ID="CreateUserWizardStep0" runat="server"> <table> <tr> <th>Billing Information</th> </tr> <tr> <td>Billing Address:</td> <td> <asp:TextBox runat="server" ID="BillingAddress" MaxLength="50" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" ControlToValidate="BillingAddress" ErrorMessage="Billing Address is required." /> </td> </tr> <tr> <td>Billing City:</td> <td> <asp:TextBox runat="server" ID="BillingCity" MaxLength="50" Columns="15" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator2" ControlToValidate="BillingCity" ErrorMessage="Billing City is required." /> </td> </tr> <tr> <td>Billing State:</td> <td> <asp:TextBox runat="server" ID="BillingState" MaxLength="25" Columns="10" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator3" ControlToValidate="BillingState" ErrorMessage="Billing State is required." /> </td> </tr> <tr> <td>Billing Zip:</td> <td> <asp:TextBox runat="server" ID="BillingZip" MaxLength="10" Columns="10" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator4" ControlToValidate="BillingZip" ErrorMessage="Billing Zip is required." /> </td> </tr> </table> </asp:WizardStep> このWizardStep( ユーザーの発送先情報を収集するには、これとほとんど同じ 最初に作成したCreateUserWizardStepをそのままにして、既定のフィールドを表示するだけでもよいのですが、前の2つのステップに合わせてレイアウトをカスタマイズしてみましょう。これにより、後でこのステップを自分でもっと大きくカスタマイズするときに必要な知識が身につくと思います。このステップをカスタマイズするには、まずこのステップ内に <asp:CreateUserWizardStep ID="CreateUserWizardStep2" runat="server"> <ContentTemplate> <table> <tr> <th>User Information</th> </tr> <tr> <td>Username:</td> <td> <asp:TextBox runat="server" ID="UserName" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator9" ControlToValidate="UserName" ErrorMessage="Username is required." /> </td> </tr> <tr> <td>Password:</td> <td> <asp:TextBox runat="server" ID="Password" TextMode="Password" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator10" ControlToValidate="Password" ErrorMessage="Password is required." /> </td> </tr> <tr> <td>Confirm Password:</td> <td> <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator13" ControlToValidate="ConfirmPassword" ErrorMessage="Confirm Password is required." /> </td> </tr> <tr> <td>Email:</td> <td> <asp:TextBox runat="server" ID="Email" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator11" ControlToValidate="Email" ErrorMessage="Email is required." /> </td> </tr> <tr> <td>Question:</td> <td> <asp:TextBox runat="server" ID="Question" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator12" ControlToValidate="Question" ErrorMessage="Question is required." /> </td> </tr> <tr> <td>Answer:</td> <td> <asp:TextBox runat="server" ID="Answer" /> <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator14" ControlToValidate="Answer" ErrorMessage="Answer is required." /> </td> </tr> <tr> <td colspan="2"> <asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password" ControlToValidate="ConfirmPassword" Display="Dynamic" ErrorMessage="The Password and Confirmation Password must match."> </asp:CompareValidator> </td> </tr> <tr> <td colspan="2"> <asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False"></asp:Literal> </td> </tr> </table> このコードにはレイアウト用の カスタムユーザーデータの保存 ここまでの段階で、CreateUserWizardコントロールをカスタマイズして、請求先と発送先の情報をユーザーに尋ねることができるようになりました。しかし、既定のCreateUserWizardコントロールは、既定のユーザー属性(ユーザー名、メールアドレス、パスワード、秘密の質問とその答えなど)を備えた新規ユーザーをメンバシップシステムに追加するだけです。 CreateUserWizardで収集した追加情報を保存するために、今回のサンプルプロジェクトのSQL Server Expressデータベース(「App_Data」フォルダの「ASPNETDB.MDF」)内に「UserAddresses」という名前のテーブルを作成しました。このテーブルのスキーマは次のようになっています。 ![]() 「UserAddresses」テーブルの 次のマークアップでは、 <asp:SqlDataSource ID="InsertExtraInfo" runat="server" ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString1 %>" InsertCommand="INSERT INTO [UserAddresses] ([UserId], [BillingAddress], ユーザーアカウントがメンバシップシステムに追加されると、CreateUserWizardの 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(); } このイベントハンドラでは、 お好みの色を追加してプロジェクトを実行すると、次の図のようなフォームが表示されます。 ![]() 各ステップを順にたどったり、前のステップに戻ったりすることができ、フィールドに必要な情報を入力してウィザードを完了すると、新規ユーザーを作成することができます。ユーザーが作成できたら、データベーステーブルを調べて、「UserAddresses」テーブルに新しいレコードが追加されていることを確認しましょう。 まとめ今回の記事では、ASP.NET 2.0のCreateUserWizardサーバーコントロールをカスタマイズする方法を順を追って説明しました。具体的には、請求先情報と発送先情報を収集する2つの独立したステップを作成しました。さらに、ユーザーの入力内容を収集して、ASP.NETのユーザーテーブルに対する外部キーを備えたデータベーステーブルに保存しました。 それでは、ハッピープログラミング! 参考資料著者紹介Erich Peterson(Erich Peterson)
|