0
我正在創建一個使用ASP.NET窗體身份驗證和定義的自定義配置文件屬性(例如名和姓)的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>
謝謝,我在另一篇文章中看到了Profile.GetProfile()。我必須啓動SQL事件探查器才能確定,但我敢打賭,我每次都會使用該方法進行數據庫調用。所以如果你有一千個用戶,你將有一千個呼叫到循環內的數據庫。所以我不認爲這是對我的問題的可行解決方案。目前,我已經使用Entity Framework直接訪問認證數據庫。它不漂亮,但它的工作原理:\ –