4

在 Visual Studio 中创建 ASP.NET 项目时的默认网站模板会在登录到 LoginView 时显示用户的用户名。我想用用户的名字替换它。我将其存储在数据库中,因此在 Site.master 页面中我尝试了以下操作(在页面 onload 中):

    MembershipUser user = Membership.GetUser();
    string id = user.ProviderUserKey.ToString();
       SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
        try
        {
            using (connection)
            {
                using (SqlCommand con_get = new SqlCommand("SELECT firstname FROM x WHERE userId='" + id + "'", connection)) //Executes SQL command             
                {
                    try
                    {
                        connection.Open(); //Opens the database connection
                        using (SqlDataReader reader = con_get.ExecuteReader())
                        {
                            if (reader != null)
                            {
                                while (reader.Read())
                                {
                                    Label label1 = (Label)sender;
                                    label1.Text = reader["x"].ToString();
                                }
                            }
                        }
                    }
                    catch
                    {

                    }

                    finally
                    {
                        connection.Close(); //Closes the database connection
                    }
                }
            }
        }
        catch
        {

        }

目前这不起作用。我也尝试不使用发件人,只是尝试使用 label1.Text = reader["x"].ToString(); 但这没有用。

有人对我如何使这项工作有任何建议吗?

另外,这是正确的方法吗?当然有一种更有效的方法来加载名字而不是每次用户导航到不同的页面时都重新加载(因此减少了对数据库的查询数)?

4

1 回答 1

1

我认为您最终遇到的是标签位于母版页上的事实。

protected void Page_Load(object sender, EventArgs e)
{
   if(!Page.IsPostBack)
   {
      var welcomeLabel = Page.Master.FindControl("lblWelcome") as Label;
      SetName(welcomeLabel);
   }
}

这是一个手写的登录模式:

protected void SetName(Label welcomeLabel)
{
    //this is the type of thing you'd probably wanna do in the Global.asax on session start
    if (Session["userName"] == null || !Login()) return; //session variable is empty and the login attempt failed, give up
    var usersName = Session["userName"].ToString();
    welcomeLabel.Text = usersName;
}
protected bool Login()
{
    const string query = "SELECT Name FROM Users WHERE Password = @Password AND UserName = @UserName";
    using (var conn = new SqlConnection(connectionString))
    {
        using (var comm = new SqlCommand(query, conn))
        {
            comm.CommandType = CommandType.Text;
            comm.Parameters.Add(new SqlParameter("@Password", password)); //or get this from a control or wherever
            comm.Parameters.Add(new SqlParameter("@UserName", userName)); //or get this from a control or wherever
            conn.Open();
            var name = (string)comm.ExecuteScalar();
            if (!string.IsNullOrEmpty(name))
            {
                Session["userName"] = name;
                return true;
            }
            //"Login information is wrong or user doesn't exist.
            return false;
        }
    }
}

所以我们在这里所做的就是在我们的数据库中搜索用户名和密码之间的匹配项。用户名应该是唯一的,所以有点像您的主键,AND 过滤器只是确保密码与用户名匹配。简单的。

一般来说,我认为您应该在会话中存储更多有关用户的信息,以使其值得您花时间。我通常创建某种形式的用户对象,以便我可以在需要时点击它,然后通过用户对象整齐地访问它。我认为这就是 Windows Membership 类试图帮助解决的问题,但我不喜欢使用它们,除非我进行 Windows 身份验证。但这只是偏好。

于 2012-09-04T19:59:06.787 回答