获取具有ASP.NET成员资格的所有自定义属性的所有用户配置文件

获取具有ASP.NET成员资格的所有自定义属性的所有用户配置文件,asp.net,asp.net-mvc,asp.net-membership,asp.net-authentication,Asp.net,Asp.net Mvc,Asp.net Membership,Asp.net Authentication,我正在创建一个MVC4 web应用程序,该应用程序使用ASP.NET表单身份验证,并定义自定义配置文件属性,例如名字和姓氏 经过一些争论之后,这对于注销小部件来说效果很好: Hello, @((Profile as ProfileCommon).FirstName) @((Profile as ProfileCommon).LastName) 但是现在我需要制作一个管理屏幕,其中显示文档列表中所有作者的名字和姓氏 这是为了显示信息网格,因此出于性能原因,我不能为每个用户进行数据库绑定调用

我正在创建一个MVC4 web应用程序,该应用程序使用ASP.NET表单身份验证,并定义自定义配置文件属性,例如名字和姓氏

经过一些争论之后,这对于注销小部件来说效果很好:

Hello, 

@((Profile as ProfileCommon).FirstName)

@((Profile as ProfileCommon).LastName)
但是现在我需要制作一个管理屏幕,其中显示文档列表中所有作者的名字和姓氏

这是为了显示信息网格,因此出于性能原因,我不能为每个用户进行数据库绑定调用。我需要在一两次查询中获得所有信息

我有每行的作者成员身份用户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.???
            };
        }
    }
}
public静态IEnumerable GetUserInfos()
{
var members=Membership.GetAllUsers();
var profiles=ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach(成员中的成员身份用户成员)
{
var profile=profiles[member.UserName];
if(profile!=null)
{
返回新用户信息
{
UserId=(Guid)member.ProviderUserKey,
FirstName=配置文件。???,
LastName=配置文件。???
};
}
}
}
我正在成功地从方法中获取成员和配置文件。但所有概要文件对象都是ProfileInfo对象,而不是ProfileCommon或ProfileBase。它们似乎无法访问自定义属性

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
            };
        }
    }
}
为什么这种技术缺少自定义属性?我怎样才能得到它们

有更好或更简单的方法吗

相关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>

您需要获取对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
            };
        }
    }
}
public静态IEnumerable GetUserInfos()
{
var members=Membership.GetAllUsers();
var profiles=ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach(成员中的成员身份用户成员)
{
var profile=profiles[member.UserName];
ProfileCommon=Profile.GetProfile(Profile.UserName);
if(profileCommon!=null)
{
返回新用户信息
{
UserId=(Guid)member.ProviderUserKey,
FirstName=profileCommon.FirstName,
LastName=profileCommon.LastName
};
}
}
}

您需要获取对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
            };
        }
    }
}
public静态IEnumerable GetUserInfos()
{
var members=Membership.GetAllUsers();
var profiles=ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
foreach(成员中的成员身份用户成员)
{
var profile=profiles[member.UserName];
ProfileCommon=Profile.GetProfile(Profile.UserName);
if(profileCommon!=null)
{
返回新用户信息
{
UserId=(Guid)member.ProviderUserKey,
FirstName=profileCommon.FirstName,
LastName=profileCommon.LastName
};
}
}
}

谢谢,我在另一篇文章中看到了Profile.GetProfile()。我必须启动SQL profiler才能确定,但我敢打赌,该方法每次都会进行数据库调用。因此,如果您有一千个用户,那么在循环中将有一千个对数据库的调用。所以我认为这不是解决我问题的可行办法。目前,我已经求助于使用实体框架直接访问身份验证数据库。它虽然不漂亮,但很有效:\谢谢,我在另一篇文章中看到了Profile.GetProfile()。我必须启动SQL profiler才能确定,但我敢打赌,该方法每次都会进行数据库调用。因此,如果您有一千个用户,那么在循环中将有一千个对数据库的调用。所以我认为这不是解决我问题的可行办法。目前,我已经求助于使用实体框架直接访问身份验证数据库。虽然不漂亮,但它很管用:\