2012-09-28 3 views
0

내 사용자 목록에있는 각 사용자가 그렇지 않은 것을 알 때 온라인으로 표시되는 문제가 있습니다.회원이 아닌 사용자가 온라인 상에 나타나면?

페이지가로드되면 오프라인으로 표시되지만 페이지를 새로 고침하면 모두 온라인으로 표시됩니다. Gridview에 표시 할 데이터를 얻으려면 프로그래밍 방식으로 자신의 프로필 정보 (CommonProfile)에 액세스하고 있기 때문에 이것이라고 가정합니다.

IsOnline 속성을 true로 설정하지 않고 프로필 정보를 가져올 수있는 방법이 있습니까?

업데이트 : 죄송합니다. 코드는 여기에 있습니다. 제발 부드럽게, 나는 상대적으로 C# & asp.net에 새롭고 나는 여전히 배우고있다.

코드는 회원 사용자와 공통 프로필에서 정보를 수집하고 그 결과를 gridview에 표시 할 수 있도록 데이터 테이블에 필드를 추가합니다. 당신은 단순히 인 getUser의 다른 오버로드를 보았다 경우

MembershipUserCollection usersList = Membership.GetAllUsers(); 
MembershipUserCollection filteredUsers = new MembershipUserCollection(); 

foreach (MembershipUser user in usersList) 
{ 
    if (!Roles.IsUserInRole(user.UserName, "Admin") && !Roles.IsUserInRole(user.UserName, "Engineering")) 
    { 
     if (txtFilterCustomerNo.Text.Length > 0) 
     { 
      ProfileCommon PC = Profile.GetProfile(user.UserName); 
      if (PC.CompanyAccountNo == txtFilterCustomerNo.Text.ToUpper()) 
      { 
       filteredUsers.Add(user); 
      } 
     } 
     else 
     { 
      filteredUsers.Add(user); 
     } 
    } 
} 

txtFilterCustomerNo.Text = null; 

foreach (MembershipUser user in filteredUsers) 
{ 
    userProfile = Profile.GetProfile(user.UserName); 
    string[] userRoles = Roles.GetRolesForUser(user.UserName); 

    DataRow orderLine = dataSet.Tables["UserAccounts"].NewRow(); 
    orderLine["USER_NAME"] = user.UserName; 
    orderLine["CREATED"] = user.CreationDate; 
    orderLine["LAST_LOGIN"] = user.LastLoginDate; 
    orderLine["PASSWORD_CHANGED"] = user.LastLoginDate; 
    orderLine["ACTIVE"] = user.IsApproved; 
    orderLine["ONLINE"] = user.IsOnline; 
    orderLine["LOCKED"] = user.IsLockedOut; 
    orderLine["CUSTOMER_NO"] = userProfile.CompanyAccountNo; 
    orderLine["HAS_INVENTORY"] = userProfile.HasOwnInventory; 
    orderLine["ORDER"] = userRoles.Contains("Order"); 
    orderLine["REPAIR"] = userRoles.Contains("Repair"); 
    orderLine["WARRANTY"] = userRoles.Contains("Warranty"); 
    orderLine["COMMISSIONING"] = userRoles.Contains("Commissioning"); 
    orderLine["ACCOUNT"] = userRoles.Contains("Account"); 
    dataSet.Tables["UserAccounts"].Rows.Add(orderLine); 
} 

if (dataSet.Tables.Contains("UserAccounts")) 
{ 
    GridView1.DataSource = dataSet.Tables["UserAccounts"]; 
} 
+0

사용자에게 액세스하는 실제 코드가 도움이 될 수 있습니다. –

답변

2

, 당신은 그들 중 일부는 부울이 userIsOnline라고 걸릴 것을 볼 것입니다. 이것을 false로 지정하면 마지막 온라인 시간 소인이 갱신되지 않고 온라인으로 나열되지 않습니다.

var user = Membership.GetUser(userid, false); 

편집 :

난 당신이 GetAllUsers()보다는 GetUser()를 사용하는 참조하십시오. GetAllUsers()에는 몇 가지 문제가 있으며 IsOnline 속성에 의존 할 수 없습니다. 대신 LastActivityDate 필드를 확인하고 현재 날짜 시간과의 차이를 알아 내야합니다. 시간의 양이 "온라인"이라고 생각하는 것보다 큰 경우, 오프라인이거나 그렇지 않은 경우 온라인입니다.

+0

내가 이것을 찾았지만 코드에서 과부하가 사용 가능한 것으로 보이지 않습니다. 아마도 내가하려는 일을 성취하기위한 더 좋은 방법이있을 수 있지만 asp.net 및 C#에 익숙하지 않은 나는 아직 배우고 있습니다. – Stuart

+0

나는 당신에게 확신한다, 그것이있다. 회원 자격의 API는 7 년 전에 도입 된 이후로 변경되지 않았습니다. –

+0

나는 그 설정을 보았다는 것을 의심하지 않는다. 그것은 위의 코드에서 나와 사용할 수 없다. 내가 볼 수 있는게 아니야? 물론 GetAllUsers()에는 없습니다 ... – Stuart

관련 문제