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> 

回答

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 
      }; 
     } 
    } 
} 
+1

謝謝,我在另一篇文章中看到了Profile.GetProfile()。我必須啓動SQL事件探查器才能確定,但​​我敢打賭,我每次都會使用該方法進行數據庫調用。所以如果你有一千個用戶,你將有一千個呼叫到循環內的數據庫。所以我不認爲這是對我的問題的可行解決方案。目前,我已經使用Entity Framework直接訪問認證數據庫。它不漂亮,但它的工作原理:\ –

相關問題