在LoginView中显示用户名

时间:2012-09-04 16:46:11

标签: c# asp.net database loginview

在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();但那没用。

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

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

1 个答案:

答案 0 :(得分: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成员资格类试图帮助的,但除非我进行Windows身份验证,否则我不喜欢使用它们。但这只是偏好。