1

姓名などのカスタム プロファイル プロパティが定義された ASP.NET フォーム認証を使用する MVC4 Web アプリケーションを作成しています。

いくつかの論争の後、これはログアウトウィジェットでうまく機能しています:

Hello, 

@((Profile as ProfileCommon).FirstName)

@((Profile as ProfileCommon).LastName)

しかし、ここで、ドキュメントのリストの作成者全員の姓名を (とりわけ) 表示する管理画面を作成する必要があります。

これは情報のグリッドを表示するためのものであるため、パフォーマンス上の理由から、すべてのユーザーに対してデータベースにバインドされた呼び出しを行うことはできません。1 つまたは 2 つのクエリですべての情報を取得する必要があります。

各行に作成者のメンバーシップ ユーザー ID GUID があります。そのため、すべてのユーザーの姓名を GUID からキーオフする必要があります。

このトピックに関する他のいくつかの SO 投稿を確認した後、情報を取得するためにこの静的メソッドを思いつきました。

public static IEnumerable<UserInfo> GetUserInfos()
{
    var members = Membership.GetAllUsers();

    var profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);

    foreach (MembershipUser member in members)
    {
        var profile = profiles[member.UserName];

        if (profile != null)
        {
            yield return new UserInfo
            {
                UserId = (Guid)member.ProviderUserKey,

                FirstName = profile.???,

                LastName = profile.???
            };
        }
    }
}

メソッドからメンバーとプロファイルを正常に取得しています。ただし、すべてのプロファイル オブジェクトは ProfileInfo オブジェクトであり、ProfileCommon または ProfileBase ではありません。カスタム プロパティにアクセスする方法はないようです。

この手法にカスタム プロパティがないのはなぜですか? どうすれば入手できますか?

これを行うためのより良い方法または簡単な方法はありますか?

参考までに、関連する web.config 値:

<authentication mode="Forms">
    <!--<forms name=".ASPXAUTH" protection="None" domain=".napa-ibs.com" path="/" loginUrl="Account/Login" />-->
    <forms name=".ASPXAUTH" protection="None" path="/" loginUrl="Account/Login" />
</authentication>
<roleManager enabled="true">
    <providers>
        <clear/>
        <add
            name="AspNetSqlRoleProvider"
            connectionStringName="AuthenticationDatabase"
            applicationName="IBSRegistration"
            type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </providers>
</roleManager>
<membership>
    <providers>
        <clear/>
        <add
            name="AspNetSqlMembershipProvider"
            type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
            connectionStringName="AuthenticationDatabase"
            enablePasswordRetrieval="true"
            enablePasswordReset="true"
            requiresQuestionAndAnswer="false"
            applicationName="IBSRegistration"
            requiresUniqueEmail="false"
            passwordFormat="Clear"
            maxInvalidPasswordAttempts="100"
            minRequiredPasswordLength="7"
            minRequiredNonalphanumericCharacters="1"
            passwordAttemptWindow="10"/>
    </providers>
</membership>
<profile enabled="true">
    <providers>
        <clear/>
        <add
            name="AspNetSqlProfileProvider"
            connectionStringName="AuthenticationDatabase"
            applicationName="IBSRegistration"
            type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </providers>
    <properties>
        <add name="FirstName" type="string"/>
        <add name="LastName" type="string"/>
        <add name="Title" type="string"/>
        <add name="District" type="string"/>
        <add name="DC" type="string"/>
        <add name="Address1" type="string"/>
        <add name="Address2" type="string"/>
        <add name="City" type="string"/>
        <add name="State" type="string"/>
        <add name="ZipCode" type="string"/>
        <add name="IsApproved" type="bool"/>
        <add name="RegistrationDate" type="DateTime"/>
    </properties>
</profile>
4

1 に答える 1

1

カスタム プロパティにアクセスするには、CommonProfile オブジェクトへの参照を取得する必要があります。

public static IEnumerable<UserInfo> GetUserInfos()
{
    var members = Membership.GetAllUsers();

    var profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);

    foreach (MembershipUser member in members)
    {
        var profile = profiles[member.UserName];
        ProfileCommon profileCommon = Profile.GetProfile(profile.UserName);

        if (profileCommon != null)
        {
            yield return new UserInfo
            {
                UserId = (Guid)member.ProviderUserKey,

                FirstName = profileCommon.FirstName,

                LastName = profileCommon.LastName
            };
        }
    }
}
于 2012-09-19T00:42:29.580 に答える