我正在创建一个 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.???
};
}
}
}
我成功地从方法中获取了成员和个人资料。但所有配置文件对象都是 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>