如何在ASPX页面的asp:LinkButton的CommandName属性中传递C#变量?
解决ASP.NET服务器控件无法用<%= %>传递变量到CommandName的问题
这个问题我太熟悉了!ASP.NET服务器控件(比如asp:LinkButton)的属性绑定逻辑和普通HTML元素不一样,<%= %>语法在这里会失效——原因是服务器控件的属性是在服务器端解析阶段处理的,而<%= %>要等到页面渲染到客户端时才会输出内容,所以服务器会把<%= category.idCategory %>当成纯字符串直接赋值给CommandName,而不是解析成实际的ID值。
下面给你几个可行的解决方法,按推荐程度排序:
方案一:使用Repeater数据绑定控件(最规范)
这是ASP.NET中处理重复数据渲染的标准方式,数据绑定表达式<%# %>能正确把值传递给服务器控件属性。
修改后的前台代码
<asp:Repeater ID="rptCategories" runat="server" OnItemCommand="Select_Command"> <HeaderTemplate> <tbody> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Eval("idCategory") %></td> <td><%# Eval("name") %></td> <td> <!-- 推荐用CommandName标识操作类型,CommandArgument传ID --> <asp:LinkButton runat="server" CommandName="Select" CommandArgument='<%# Eval("idCategory") %>' CssClass="btn btn-info btn-block btn-md" Text="Select" /> </td> </tr> </ItemTemplate> <FooterTemplate> </tbody> </FooterTemplate> </asp:Repeater>
修改后的后台代码
在Page_Load事件中绑定数据源:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { using (DAL.InventoryEntities Ie = new DAL.InventoryEntities()) { rptCategories.DataSource = Ie.Categories; rptCategories.DataBind(); } } } protected void Select_Command(object sender, CommandEventArgs e) { if (e.CommandName == "Select") { string categoryId = e.CommandArgument.ToString(); Response.Write("Hello " + categoryId); } }
方案二:手动给服务器控件属性赋值(适合不想改控件结构的场景)
如果不想换成数据绑定控件,可以在foreach循环中直接给LinkButton的CommandName属性赋值:
修改后的前台代码
<tbody ID="tbody"> <% using (DAL.InventoryEntities Ie = new DAL.InventoryEntities()) { foreach (DAL.Category category in Ie.Categories) { %> <tr> <td><%: category.idCategory %></td> <td><%: category.name %></td> <td> <asp:LinkButton ID="lbSelect" runat="server" CssClass="btn btn-info btn-block btn-md" Text="Select" OnCommand="Select_Command"></asp:LinkButton> <%-- 直接在服务器端给属性赋值 --%> <% lbSelect.CommandName = category.idCategory.ToString(); %> </td> </tr> <% } } %> </tbody>
后台代码无需修改
原来的Select_Command方法可以直接使用,点击后就能拿到正确的ID值。
补充说明
如果你的业务逻辑中CommandName需要用来区分不同操作(比如同时有Select、Edit、Delete按钮),更规范的做法是把CommandName设为固定的操作标识(比如"Select"),然后用CommandArgument传递ID参数,就像方案一中那样,这样代码的可读性和可维护性会更好。
内容的提问来源于stack exchange,提问作者oualid
相关产品推荐
相关产品推荐

