none
CreateUserWizardで追加した入力項目の内容をASPNETDBから取得できません RRS feed

  • 質問

  • 現在、Windows2008server,SQLserver2005,VisualStudio2008の環境で開発しております。

    フォーム認証での動作は確認できていますが、新規登録で漢字の名前も必要となりCreateUserWizardに
    入力できるようにテキストボックスを追加しました。(web.configには"KanjiName"をAddしてあります)
    入力するとASPNETDBのaspnet_Profileに入力した漢字名が含まれるレコードが追加されたのは確認できました。

    ところが、漢字の名前で登録したIDでログオンし Profile.KanjiName で名前を取得しようとしましたが取得できず
    テーブルを見てみると、aspnet_Membership と aspnet_Profile のUserIDが違っておりました。
    (ちなみに、UserIDを同じにしてみたら取得できましたが・・・)

    そもそも取得方法がまちがっているのでしょうか?
    よろしくお願いいたします。

    2010年1月20日 7:45

回答

  • 参考になるかな、ってことで昔みたBlogの記事ひっぱりだしてきてみました。

    http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    • 回答としてマーク 菊地俊介 2010年2月17日 4:58
    2010年1月21日 6:50
  • CreateUserWizard1_CreatedUser イベントハンドラ内で、

    Profile.SetPropertyValue("KanjiName", txtName.Text)

    を、以下に置き換えるとうまくいくのではないかと思います(すみませんが、VB はよく分からな
    いので C# で書きました。VB に書き換えてください)。

    ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);
    p.KanjiName = txtName.Text;
    p.Save();

    お試しください。

    なお、匿名ユーザーのアクセスを許可しておくと、aspnet_Users に匿名ユーザーが残ってしま
    うので、web.config で KanjiName プロパティの allowAnonymous を false にしておいた方
    がいいと思います。

    • 編集済み SurferOnWww 2010年1月26日 2:48 誤記訂正: Createuserwizard1 → CreateUserWizard1
    • 回答としてマーク 菊地俊介 2010年2月17日 4:58
    2010年1月26日 2:44

すべての返信

  • ユーザ情報ですが、一度ユーザが作成されていから追加するような形にしないとダメだったんじゃないかと思います。
    プロファイルは認証していない状態でも使えるようになっているので、ユーザができるまえにプロファイルに漢字名の登録が行われちゃったんじゃないでしょうか。

    たしかScottGuのBlogだったと思いますが、CreateUserWizardにワンステップ追加してプロファイルに必要な情報を登録する方法が載っていたと思います。
    また、別の方法としては認証前のプロファイルが持っている情報をユーザ登録した時点で引き継ぐということができるので、その引き継ぎを使うようにすればよいかな、と思います。

    #未検証ですが。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2010年1月20日 8:09
  • 小野@どっとねっとふぁん様

    さっそく返信いただきありがとうございます。

    テーブルにレコードが追加される状況をみたのですが、まず aspnet_Membership に追加されたのち aspnet_Profile にレコードが
    追加されておりました。
    IDもやはり違ったものでした。

    お教えいただいたBlogを参考にもう少し勉強してみたいと思います。

    2010年1月20日 10:17
  • 以下のページの「匿名プロファイルの情報の移行」が参考になりませんか?

    ASP.NET プロファイル プロパティのユーザー ID
    http://msdn.microsoft.com/ja-jp/library/ewfkf772.aspx

    2010年1月20日 12:47
  • SurferOnWww様 情報いただきありがとうございます。

    申し訳ありませんが、先にこちらでテストした結果を報告させていただきます。

    早くためしてみればよかったのですが、新たに2つ目のIDを登録したところ、aspnet_Profile には新しいIDで上書きされて
    しまいました。さらに追加すると上書きされてしまい常に1レコードしか残りません。

    何か根本的に設定が間違っているかもしれませんので、一度はじめからやり直してみたいと思います。
    皆様せっかく貴重な時間をいただいたのに申し訳ありません。

    また結果報告させていただきます。

    ありがとうございました。
    2010年1月21日 4:39
  • 参考になるかな、ってことで昔みたBlogの記事ひっぱりだしてきてみました。

    http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    • 回答としてマーク 菊地俊介 2010年2月17日 4:58
    2010年1月21日 6:50
  • 小野@どっとねっとふぁん 様

    情報いただきありがとうございました。
    いただいた記事参考にさせていただき、テストしてみましたが結果はうまくいきませんでした。

    CreateUserWizard1_CreatedUserというイベントにおいて、aspnet_Userテーブルに作られた
    ユーザーIDと同じIDを持つprofileレコードができると解釈しましたが
    匿名ユーザーとして(aspnet_userでできたユーザーIDとは違うもので)登録されてしまいました。
    LoginCreatedUserはTrueに設定おりますができませんでした。

    ほかのイベントも捕らえてみましたがいずれもうまくいきませんでした。

    結局、認証後に表示するページにてaspnet_Profileテーブルに登録がなければそこで
    漢字名を入力させることで対処することにいたしました。

    皆様、アドバイスをいただきありがとうございました。

    2010年1月25日 1:29
  • > CreateUserWizard1_CreatedUserというイベントにおいて、aspnet_Userテーブルに作られた
    > ユーザーIDと同じIDを持つprofileレコードができると解釈しましたが
    > 匿名ユーザーとして(aspnet_userでできたユーザーIDとは違うもので)登録されてしまいました。

    差し支えなければ、問題を再現できる必要最小限のコードをアップしていただければ、こちらでも
    検証できるので、問題解決のお役に立てるかもしれません。

    2010年1月25日 14:37
  • SurferOnWww 様 

    ありがとうございます。
    それではアップさせていただきますのでよろしくお願いいたします。

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="CreateUser.aspx.vb" Inherits="CreateUserWizard_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
            <asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
                <WizardSteps>
                    <asp:CreateUserWizardStep runat="server">
                        <ContentTemplate>
                            <table border="0">
                                <tr>
                                    <td align="center" colspan="2">
                                        新しいアカウントにサインアップ</td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">ユーザー名:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="UserName" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="UserNameRequired" runat="server"
                                            ControlToValidate="UserName" ErrorMessage="ユーザー名が必要です。" ToolTip="ユーザー名が必要です。"
                                            ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="Label1" runat="server" AssociatedControlID="Label1">ユーザー名(漢字):</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                                            ControlToValidate="txtName" ErrorMessage="ユーザー名(漢字)が必要です。" ToolTip="ユーザー名(漢字)が必要です。"
                                            ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">パスワード:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="PasswordRequired" runat="server"
                                            ControlToValidate="Password" ErrorMessage="パスワードが必要です。" ToolTip="パスワードが必要です。"
                                            ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="ConfirmPasswordLabel" runat="server"
                                            AssociatedControlID="ConfirmPassword">パスワードの確認入力:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="ConfirmPassword" runat="server" TextMode="Password"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server"
                                            ControlToValidate="ConfirmPassword" ErrorMessage="パスワードの確認入力が必要です。"
                                            ToolTip="パスワードの確認入力が必要です。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">電子メール:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="Email" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="EmailRequired" runat="server"
                                            ControlToValidate="Email" ErrorMessage="電子メールが必要です。" ToolTip="電子メールが必要です。"
                                            ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="QuestionLabel" runat="server" AssociatedControlID="Question">セキュリティの質問:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="Question" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="QuestionRequired" runat="server"
                                            ControlToValidate="Question" ErrorMessage="セキュリティ質問が必要です。"
                                            ToolTip="セキュリティ質問が必要です。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="Answer">セキュリティ返答:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="Answer" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="AnswerRequired" runat="server"
                                            ControlToValidate="Answer" ErrorMessage="セキュリティ返答が必要です。"
                                            ToolTip="セキュリティ返答が必要です。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center" colspan="2">
                                        <asp:CompareValidator ID="PasswordCompare" runat="server"
                                            ControlToCompare="Password" ControlToValidate="ConfirmPassword"
                                            Display="Dynamic" ErrorMessage="パスワードと確認用パスワードは一致しなければなりません。"
                                            ValidationGroup="CreateUserWizard1"></asp:CompareValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center" colspan="2" style="color:Red;">
                                        <asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False"></asp:Literal>
                                    </td>
                                </tr>
                            </table>
                        </ContentTemplate>
                    </asp:CreateUserWizardStep>
                    <asp:CompleteWizardStep runat="server" >
                        <ContentTemplate>
                            <table border="0">
                                <tr>
                                    <td align="center" colspan="2">
                                        完了</td>
                                </tr>
                                <tr>
                                    <td>
                                        アカウントが正しく作成されました。</td>
                                </tr>
                                <tr>
                                    <td align="right" colspan="2">
                                        <asp:Button ID="ContinueButton" runat="server" CausesValidation="False"
                                            CommandName="Continue" Text="続行" ValidationGroup="CreateUserWizard1" />
                                    </td>
                                </tr>
                            </table>
                        </ContentTemplate>
                    </asp:CompleteWizardStep>
                </WizardSteps>
            </asp:CreateUserWizard>
       
        </div>
        </form>
    </body>
    </html>



    Partial Class CreateUserWizard_Default
        Inherits System.Web.UI.Page

        Protected Sub CreateUserWizard1_CreatedUser(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateUserWizard1.CreatedUser
            Dim txtName As TextBox = CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtName")
            Profile.SetPropertyValue("KanjiName", txtName.Text)
        End Sub

    End Class

    2010年1月26日 1:00
  • CreateUserWizard1_CreatedUser イベントハンドラ内で、

    Profile.SetPropertyValue("KanjiName", txtName.Text)

    を、以下に置き換えるとうまくいくのではないかと思います(すみませんが、VB はよく分からな
    いので C# で書きました。VB に書き換えてください)。

    ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);
    p.KanjiName = txtName.Text;
    p.Save();

    お試しください。

    なお、匿名ユーザーのアクセスを許可しておくと、aspnet_Users に匿名ユーザーが残ってしま
    うので、web.config で KanjiName プロパティの allowAnonymous を false にしておいた方
    がいいと思います。

    • 編集済み SurferOnWww 2010年1月26日 2:48 誤記訂正: Createuserwizard1 → CreateUserWizard1
    • 回答としてマーク 菊地俊介 2010年2月17日 4:58
    2010年1月26日 2:44
  • SurferOnWww 様

    教えていただいた方法で成功いたしました。本当にありがとうございます。

     Dim userProfile As ProfileCommon = ProfileCommon.Create(CreateUserWizard1.UserName, True)
            userProfile.KanjiName = txtName.Text
            userProfile.Save()

    当初のCreateUserWizard 内で漢字名を入力する形に戻したいと思います。

    小野@どっとねっとふぁん 様にもお礼申し上げます。

    2010年1月26日 5:35