繁体   English   中英

在C#中传递变量

[英]Passing a variables in C#

我正在尝试将一个标识工作人员从其登录详细信息的变量传递到下一个屏幕,以填充“测试人员ID”框。

我会更好地使用在设置下一个屏幕时读取的全局变量,还是将其放入变量并发送到下一个屏幕更好?

登录代码如下:

public Login()
    {
        InitializeComponent();
    }

    private void LoginButton_Click(object sender, EventArgs e)
    {


        String Username1 = StaffUsername.Text;
        String Password1 = StaffPassword.Text;
        String HardUser = "Test";
        String HardPass = "Merlin123";


        if (Username1 == "" && Password1 == "")
        {
            MessageBox.Show("Please Enter Login Id and Password");
        }
        else
        {
            if (Username1.Equals(HardUser) && Password1.Equals(HardPass))
            {
                this.Hide();
                AddingClients M1 = new AddingClients();
                M1.Show();
            }
            else{
                this.Hide();
                Login Lg = new Login();
                Lg.Show();

                MessageBox.Show("Incorrect Username or Password Entered");
            }
        }
    }
}

}

我现在使用的是硬编码的用户名和密码,但是在实际程序中,我将在数据库上进行此调用,并比较用户名和密码,然后进入下一个屏幕。

具有登录操作将其移至下一个屏幕的全局变量会更好,还是让下一个屏幕读取然后填充所需文本框的变量会更容易? 我将如何处理?

谢谢

执行此操作的方法是使用Thread.CurrentPrincipal

一旦确认用户是他们说的是谁,您就可以执行以下操作:

private static void SignUserIn(string userName)
{
      GenericIdentity identity = new GenericIdentity(userName, null);
      Thread.CurrentPrincipal = new GenericPrincipal(identity);
}

然后,每当需要userName时,就可以使用Thread.CurrentPrincipal.Identity.Name


为了进一步扩展它,可能最好将其抽象一点,以便您可以换入和换出提供程序,例如,您可能想使用Windows身份验证。

因此,您可以这样做:

public interface IAuthenticator
{
   bool IsValidUser ( string username, string password );

   IPrincipal SignInUser ( string username );

   void SignOutCurrentUser();
}

public class DbAuthenticator : IAuthenticator
{
   public bool IsValidUser ( string username, string password )
   {
      // Check user here and return bool if valid
   }

   public void SignInUser(string userName, string[] roles = null)
   {
      GenericIdentity identity = new GenericIdentity(userName, roles);
      Thread.CurrentPrincipal = new GenericPrincipal(identity);  
      return Thread.CurrentPrincipal;
   }

   public void SignOutUser()
   {
      Thread.CurrentPrincipal = WindowsPrincipal.GetCurrent();
   }
}

然后在您的代码中,使用某种DI模式注入身份验证器。 因此,MEF会像这样:

[Export(typeof(IAuthenticator))]
public interface IAuthenticator { }

并以您的形式:

[Import]
internal IAuthenticator authenticator;

private static void SignUserIn(string userName)
{
    authenticator.SignUserIn(username);
}

您应该有一个User对象,并将其传递给其他页面和功能。 这样,它们就变得更容易测试。

但是,您还需要将该对象全局存储在某个位置,以便可以在需要时检索当前登录的用户。 问题在于那段代码取决于现有/工作的用户存储,但是如果只有一个地方就可以了。

PS:您的标题应该是:传递用户或在全球存储?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM