为何Button的CommandArgument='<%# Eval("ID") %>'取值为空?
问题重现
.aspx代码片段:
<td rowspan="2" class="btn" > <asp:HiddenField id="hdnID" value='<%# Eval("ID") %>' runat="server" /> <asp:Button ID="BtnAnswer" runat="server" Text="Answer" EnableViewState="false" CssClass="answer-button" CommandName="OpenPage" CommandArgument='<%# Eval("ID") %>' CausesValidation="false" /> </td>
后台.cs代码片段:
protected void listView_ItemCommad(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "OpenPage") { string id = (e.CommandArgument).ToString(); Response.Redirect("GoIkenHenshuuGamen.aspx?id=" + id); } }
已确认hdnID的值为2,但后台获取e.CommandArgument时为空。
可能原因及解决办法
原因1:Button关闭ViewState且ListView未在回发时重新绑定
给Button设置了EnableViewState="false"后,回发时ViewState不会保存CommandArgument的绑定值;如果ListView仅在首次加载(!IsPostBack分支)绑定数据,回发时ListView不会重新渲染,导致CommandArgument无法被重新赋值。
解决办法:
要么在每次页面加载时(包括回发)都执行ListView的数据绑定:protected void Page_Load(object sender, EventArgs e) { BindListView(); // 无论是否回发都执行绑定逻辑 }要么删除Button的
EnableViewState="false"属性,让ViewState自动保存CommandArgument的值,回发时无需重新绑定即可获取。原因2:ListView事件方法名拼写错误
后台方法名是listView_ItemCommad,正确的事件方法名应为ItemCommand(少了字母n)。如果前台ListView的OnItemCommand属性绑定的是正确名称,这个拼写错误的方法可能无法被正确触发,建议修正方法名。替代方案:通过HiddenField直接获取ID
既然已有能正确取值的HiddenField,可以在ItemCommand事件中直接查找当前Item内的HiddenField来获取ID,绕开CommandArgument的问题:protected void listView_ItemCommand(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "OpenPage") { HiddenField hdnID = (HiddenField)e.Item.FindControl("hdnID"); string id = hdnID.Value; Response.Redirect("GoIkenHenshuuGamen.aspx?id=" + id); } }
内容的提问来源于stack exchange,提问作者Not_Wibu
相关产品推荐
相关产品推荐

