2012-09-20 36 views
0

我希望根據SqlMembershipProvider模式創建所有用戶的數據庫表設置摘要表。到目前爲止,我有:使用SQL成員資格提供程序顯示包括角色的成員信息

<asp:GridView ID="UserAccounts" runat="server" AutoGenerateColumns="False"> 
    <Columns> 
     <asp:BoundField DataField="UserName" HeaderText="UserName" /> 
     <asp:BoundField DataField="Email" HeaderText="Email" /> 
     <asp:TemplateField HeaderText="Role"> 
      <ItemTemplate> 
       <asp:TextBox ID="RoleText" ReadOnly="true" runat="server"> 
       </asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

爲表,和代碼隱藏:

UserAccounts.DataSource = Membership.GetAllUsers(); 
UserAccounts.DataBind(); 

要生成的用戶列表。但是,對於熟悉SQLmembershipprovider的人員,與用戶關聯的角色分佈在多個單獨的表中。因此,我不確定如何檢索該信息並將其顯示在每個用戶旁邊。

我現在想要的解決方案是以某種方式逐行遍歷表,然後調用該用戶名上的Roles.GetRolesForUser()來檢索信息,然後將其綁定到表。但是,我不確定如何做到這一點,如果它甚至是最有效的方法。

+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

嘗試結合

var userRoles = from MembershipUser user in Membership.GetAllUsers() 
        from role in Roles.GetRolesForUser(user.UserName) 
        select new { 
         UserName = user.UserName, Email = user.Email, Role = role }; 

var userRoles = from MembershipUser user in Membership.GetAllUsers() 
        let roles = Roles.GetRolesForUser(user.UserName) 
        select new { 
         UserName = user.UserName, 
         Email = user.Email, 
         Roles = string.Join(", ", roles) }; 
+0

簡單而且效果很好。謝謝。 編輯:是否有可能添加另一列不能像使用Roles.GetROlesForUser一樣輕鬆訪問不同的數據庫表?順便說一句,這種技術叫做LINQ? – Tony

+0

是的,這是使用LINQ。我強烈建議查看http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b以獲取如何製作查詢的示例。是的,如果將它與實體框架或LINQ to SQL結合使用,也可以通過這種方式從表中抽取事物。編輯你的問題,提供更多關於你想要拉動的細節,我會試着看看明天。 – JamieSee

0

可以將此方法與數據表

public DataSet CustomGetAllUsers() { 
     DataSet ds = new DataSet(); 
     DataTable dt = new DataTable(); 
     dt = ds.Tables.Add("Users"); 

     MembershipUserCollection muc; 
     muc = Membership.GetAllUsers(); 

     dt.Columns.Add("UserName", Type.GetType("System.String")); 
     dt.Columns.Add("Email", Type.GetType("System.String")); 
     dt.Columns.Add("CreationDate", Type.GetType("System.DateTime")); 

     /* Here is the list of columns returned of the Membership.GetAllUsers() method 
     * UserName, Email, PasswordQuestion, Comment, IsApproved 
     * IsLockedOut, LastLockoutDate, CreationDate, LastLoginDate 
     * LastActivityDate, LastPasswordChangedDate, IsOnline, ProviderName 
     */ 

     foreach(MembershipUser mu in muc) { 
      DataRow dr; 
      dr = dt.NewRow(); 
      dr["UserName"] = mu.UserName; 
      dr["Email"] = mu.Email; 
      dr["CreationDate"] = mu.CreationDate; 
      dt.Rows.Add(dr); 
     } 
     return ds; 
    } 

綁定:

UserAccounts.DataSource = CustomGetAllUsers().Tables[0] ; 
UserAccounts.DataBind(); 

您還可以適應您的ItemTemplateEval.DataBinder

+0

這是個好主意。然而,我不禁要問,如果有新方法將MembershipUserCollection muc與另一個數據表合併在一起,那麼新數據表與muc(例如用戶名)有相同的列和使用別處數據創建的其他列? – Tony

+0

是的,你可以合併,你在這個表中添加列,並從另一個來源導入數據 –

相關問題