2012-09-20 1 views
0

SqlMembershipProvider 스키마에 따라 데이터베이스 테이블을 설정하여 모든 사용자의 요약 테이블을 만들고 싶습니다. 지금까지 내가 가진 :Sql Membership Provider를 사용하여 역할을 포함한 멤버 정보 표시

<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 }; 
결합을 시도하여 ItemTemplate으로 적용 할 수 있습니다

또는

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를 사용하는 것처럼 쉽게 액세스 할 수없는 다른 데이터베이스 테이블의 다른 열을 추가 할 수 있습니까? Btw는 LINQ라는이 기술입니까? – Tony

+0

예 LINQ를 사용하고 있습니다. 쿼리 작성 방법에 대한 예제는 http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b를 참조하십시오. 예, Entity Framework 또는 LINQ와 SQL을 결합하면 이러한 방식으로 테이블에서 가져올 수 있습니다. 당싞이 당기고 자하는 것에 대한 더 자세한 정보를 가지고 질문을 편집하면 내일 볼 것입니다. – JamieSee

0

당신은 DataTable을

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(); 

는 또한 Eval.DataBinder

+0

이것은 좋은 생각입니다. 그러나 새로운 datatable muc (예 : 사용자 이름) 및 다른 곳에서 데이터를 사용하여 만든 다른 열과 공통적으로 하나의 열이있는 경우 MembershipUserCollection muc를 다른 데이터 테이블과 병합하는 방법이 있는지 궁금합니다. – Tony

+0

예, 병합 할 수 있습니다.이 테이블의 열을 추가하고 다른 소스의 데이터를 가져옵니다. –