0

問題があります。ユーザーリストの各ユーザーが、オンラインではないことがわかっているのにオンラインとして表示されます。

ページが読み込まれるとオフラインとして表示されますが、ページを更新するとすべてオンラインとして表示されます。これは、グリッドビューに表示するデータを取得するためにプログラムでプロファイル情報(CommonProfile)にアクセスしているためだと思いますか?

IsOnlineプロパティをtrueにトリガーせずにプロファイル情報を取得する方法はありますか?

更新: 申し訳ありませんが、コードはここにあります。優しくしてください。私はc#とasp.netに比較的慣れていませんが、まだ学習中です。

このコードは、メンバーシップユーザーと共通プロファイルから情報を収集し、結果をグリッドビューで表示できるようにフィールドをデータテーブルに追加しています。

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"];
}
4

1 に答える 1

2

GetUser のさまざまなオーバーロードを単純に見てみると、それらのいくつかが userIsOnline というブール値を取ることがわかります。これを false に指定すると、最後のオンライン タイムスタンプは更新されず、オンラインとしてリストされません。

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

編集:

GetAllUsers()ではなくを使用しているようですGetUser()。IsOnline プロパティにはいくつかの問題がありGetAllUsers()、信頼できません。LastActivityDate代わりに、フィールドをチェックして、それと現在の DateTime の違いを把握する必要があります。「オンライン」と見なされる時間よりも長い場合はオフラインであり、それ以外の場合はオンラインです。

于 2012-09-28T08:35:24.140 に答える