ASP.NET与SQL新手求助:如何绑定User.Identity.Name到GridView
解决GridView绑定User.Identity.Name不显示的问题
嘿,作为ASP.NET和SQL新手碰到这种情况真的很常见,我来帮你一步步排查可能的原因,搞定这个问题!
1. 确认数据源是否正确绑定并调用DataBind()
很多时候新手容易忘记在后台代码里调用GridView的DataBind()方法,或者没有正确把查询结果赋值给GridView的DataSource。比如你如果是用代码手动查询数据库,一定要确保写完GridView1.DataSource = 查询结果;之后,加上GridView1.DataBind();,而且最好放在!IsPostBack的判断里,避免PostBack时重复绑定出问题:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 调用绑定方法 LoadUserPayments(); } } private void LoadUserPayments() { // 这里写你的数据库查询逻辑 // 最后记得绑定并调用DataBind() GridView1.DataBind(); }
2. 确保User.Identity.Name正确传递到查询语句
你说查询测试工具能拿到数据,说明SQL语句本身没问题,但运行页面时没结果,很大概率是没有把当前用户的UserName作为参数传递给查询。手动测试时你可能直接写了固定用户名,但页面里要动态传入User.Identity.Name:
方法一:用SqlDataSource控件绑定参数
如果你用的是SqlDataSource,要配置SelectParameters来关联当前用户的Identity:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:YourDBConn %>" SelectCommand="SELECT Payment.PAY_RECEIVED, Payment.PAYMENT_DATE, Payment.PAYMENT_SUMMARY, Payment.USER_NAME, Schedule.SCHEDULE_ID, Schedule.SERVICE_DATE, Schedule.EMAIL, Schedule.ADDRESS, Schedule.FIRST_NAME, Schedule.LAST_NAME, Schedule.USER_NAME AS Expr1 FROM Payment INNER JOIN Schedule ON Payment.USER_NAME = Schedule.USER_NAME WHERE Payment.USER_NAME = @UserName"> <!-- 加WHERE过滤当前用户 --> <SelectParameters> <!-- 直接绑定Identity的Name属性 --> <asp:IdentityParameter Name="UserName" PropertyName="Name" /> </SelectParameters> </asp:SqlDataSource>
然后把GridView的DataSourceID设为这个SqlDataSource的ID即可。
方法二:后台代码手动传递参数
如果是用代码写数据库操作,一定要用参数化查询(避免SQL注入!),把User.Identity.Name作为参数传入:
private void LoadUserPayments() { string connStr = ConfigurationManager.ConnectionStrings["YourDBConn"].ConnectionString; string query = @"SELECT Payment.PAY_RECEIVED, Payment.PAYMENT_DATE, Payment.PAYMENT_SUMMARY, Payment.USER_NAME, Schedule.SCHEDULE_ID, Schedule.SERVICE_DATE, Schedule.EMAIL, Schedule.ADDRESS, Schedule.FIRST_NAME, Schedule.LAST_NAME, Schedule.USER_NAME AS Expr1 FROM Payment INNER JOIN Schedule ON Payment.USER_NAME = Schedule.USER_NAME WHERE Payment.USER_NAME = @UserName"; using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = new SqlCommand(query, conn); // 添加参数,注意参数名要和查询里的@UserName一致 cmd.Parameters.AddWithValue("@UserName", User.Identity.Name); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); GridView1.DataSource = reader; GridView1.DataBind(); reader.Close(); } }
3. 检查GridView的显示设置
- 确认GridView的
Visible属性没有被设为false,默认是true,但不小心改了的话就会不显示。 - 可以给GridView加一个EmptyDataTemplate,这样如果查询返回空结果,会显示提示,而不是直接消失:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True"> <EmptyDataTemplate> 没有找到当前用户的相关数据哦 </EmptyDataTemplate> </asp:GridView>
4. 排查是否有隐藏的错误
有时候页面没报错,但后台其实抛出了异常,导致绑定失败。你可以在页面里加错误捕获,看看具体问题:
protected void Page_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); // 输出错误信息,方便排查(上线后记得去掉) Response.Write("<div style='color:red;'>错误:" + ex.Message + "</div>"); Server.ClearError(); }
按照这些步骤一步步排查,应该就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者KB1934
相关产品推荐
相关产品推荐

