.NET(C#) Web Form如何将当前登录用户ID作为SQL参数传入SqlDataSource
报错原因
你声明参数的写法不符合Web Form控件参数的语法规则,ParameterCollection容器不支持直接在<asp:Parameter>标签内直接写赋值表达式。另外你的SQL查询还有一处笔误:WHERE AspNetUsers = @PARA1需要改成WHERE AspNetUsers.Id = @PARA1,否则即使参数传对也会执行报错。
最优实现方案
推荐使用SqlDataSource的Selecting事件赋值参数,这种方案灵活度最高,还能兼容未登录等边界场景,实现步骤如下:
- 修正
.aspx页面的控件声明:
<asp:SqlDataSource runat="server" ID="SqlDataSource1" ConnectionString='<%$ ConnectionStrings:DefaultConnection %>' SelectCommand="SELECT orders.OrderID, order_details.ProductID, order_details.Price, orders.AddressLine1, orders.TownCity, orders.PostCode, orders.AddressLine2 FROM orders INNER JOIN order_details ON orders.OrderID = order_details.OrderID INNER JOIN AspNetUsers ON orders.UserId = AspNetUsers.Id WHERE AspNetUsers.Id = @PARA1" OnSelecting="SqlDataSource1_Selecting"> <SelectParameters> <asp:Parameter Name="PARA1" DbType="String" /> </SelectParameters> </asp:SqlDataSource>
- 在对应的
.aspx.cs后置代码中添加事件处理逻辑:
protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e) { if (Context.User.Identity.IsAuthenticated) { e.Command.Parameters["@PARA1"].Value = Context.User.Identity.GetUserId(); } else { // 未登录场景按需处理,比如赋值空值或者跳转登录页 e.Command.Parameters["@PARA1"].Value = DBNull.Value; } }
简化方案(无需复杂事件逻辑)
如果你的场景不需要处理复杂的边界判断,也可以直接用表达式绑定参数默认值:
- 参数声明改为:
<asp:Parameter Name="PARA1" DbType="String" DefaultValue='<%# Context.User.Identity.GetUserId() %>' />
- 在
Page_Load中触发数据源绑定即可:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack && Context.User.Identity.IsAuthenticated) { SqlDataSource1.DataBind(); } }
内容的提问来源于stack exchange,提问作者Kevin Medjiako
相关产品推荐
相关产品推荐

