-1

我是 Windows 编程的新手,因为当用户成功登录到 Web 应用程序并每次检查母版页中的会话时,我们在会话中使用存储用户的详细信息,如果它为空,则将用户重定向到登录页面。我想在 Windows 应用程序中做同样的事情,我创建了一个登录表单:代码如下所示:

private void btnLogin_Click(object sender, EventArgs e)
    {
        clsLogin obj = new clsLogin();
        DataTable dtLogin = obj.Login_Check(txtUserName.Text.Trim(), txtPassword.Text.Trim());
        if (dtLogin.Rows.Count > 0)
        {
            if (dtLogin.Rows[0]["result"].ToString() == "3")
            {
                lblMessage.Text = "Password does not matched";
            }
            else
                if (dtLogin.Rows[0]["result"].ToString() == "2")
                {
                    lblMessage.Text = "User does not exists";
                }
                else
                {

                    Staff.Home home = new Staff.Home();
                    this.Hide();
                    home.Show();
                }
        }
    }
}

现在我要做的是:将用户信息存储在用户单击注销的位置和时间,然后它将破坏该会话并打开登录表单。

我知道这是一个非常愚蠢的问题,因为我是 Windows 编程新手,这对我来说很难,请帮忙。

4

2 回答 2

1

除了代码的明显问题之外:

  1. 按索引直接访问行
  2. 直接在事件处理程序中完成登录
    • 您应该有单独的登录服务和数据访问服务

我会:

  1. 创建一个登录服务,该服务维护当前登录的用户详细信息并自行执行身份验证。
  2. 创建登录服务可以调用以访问数据存储的数据访问服务

然后在您的事件处理程序中,您只需要调用:

if (loginService.Authenticate(username, password))
{
   // Do your UI handling here
}

那么 loginService 将有一个 .CurrentUser 属性,例如,您可以从那里开始。

例如

public class LoginService
{
    private User _currentUser;
    public bool Authenticate(string username, string password)
    {
        if (_currentUser != null)
        {
            Logout();
        }
        else
        {
            var user = DataAccess.Get("users").SingleOrDefault(u => u.Username = username);
            if (user == null)
            {
                throw new Exception("No user with that username found");
            }

            if (password == user.Password)
            {
                _currentUser = user;
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public User CurrentUser
    {
        get { return _user; }
    }
}
于 2013-04-03T12:44:08.657 回答
1

在 Web 应用程序中,假设有多个客户端连接到单个服务器;您应该使用 Session 来区分它们并将数据传递给它们中的每一个“那里然后再回来”。对于桌面应用程序,这个问题根本不存在——只有一个用户,他的数据都在这里:你不需要像 Session 这样的特殊机制。这意味着您可以使用多种不同的方法从表单中传递数据。在您的示例中,通过构造函数直接将数据传递给您的“主”表单似乎更合乎逻辑

else
{
    var userData = .... (txtUserName.Text);
    Staff.Home home = new Staff.Home(userData);
    this.Hide();
    home.Show();
}

或通过财产

else
{
    var userData = .... (txtUserName.Text);
    Staff.Home home = new Staff.Home();
    home.UserData = userData;
    this.Hide();
    home.Show();
}

这只是一个例子,还有很多选择——想想这个“单一用户,永远在线”的模型。

于 2013-04-03T12:57:35.040 回答