我的e.CommandArgument每次都返回“”

时间:2013-05-28 14:14:24

标签: c# asp.net

每当我单击其中一个删除链接按钮时,e.CommandArgument始终保留值“”。我正在读某个你不能在命令参数中使用<%#的地方,但我看到了几个例子,这是有效的。有什么建议?

在ASPX中

 <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1">
        <ItemTemplate>
            <asp:Label ID="dataLabel" runat="server" Text='<%# Eval("data") %>' />
            <br />
            <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
            &nbsp;|&nbsp;
            <asp:Label ID="Column1Label" runat="server" Text='<%# Eval("Column1") %>' />
            <br />
            <asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false">
            <LoggedInTemplate>
                <asp:LinkButton CLASS="DeleteButton" runat="server" OnCommand="Delete" CommandArgument='<%# Eval("id") %>' ViewStateMode="Disabled">Delete</asp:LinkButton>
            </LoggedInTemplate>
            </asp:LoginView>
        </ItemTemplate>
    </asp:DataList>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 

            SelectCommand="SELECT [id],[name], [data], convert(varchar, [date], 101) FROM [Announcements] ORDER BY [date] DESC">
    </asp:SqlDataSource>

在ASPX.CS

using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
        {
            SqlCommand command = conn.CreateCommand();
            command.CommandText = "DELETE FROM Annoucnements WHERE id=@id";
            command.CommandType = System.Data.CommandType.Text;

            command.Parameters.Add(new SqlParameter("id", e.CommandArgument));

            conn.Open();
            command.ExecuteNonQuery();
        }

正如Royi Namir所建议的那样,将EnableViewState更改为true可以解决问题。

2 个答案:

答案 0 :(得分:1)

稍微查了一下后,我发现一些帖子说你不能在服务器标签中使用<%# ... %>语法,这显然是错误的,因为你在{{1}使用它我确定以前我做过同样的事情。无论如何,您可以使用Text上的ItemDataBound事件:

DataList

注意我已将 <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" OnItemDataBound="DataList1_ItemDataBound"> <ItemTemplate> <asp:Label ID="dataLabel" runat="server" Text='<%# Eval("data") %>' /> <br /> <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /> &nbsp;|&nbsp; <asp:Label ID="Column1Label" runat="server" Text='<%# Eval("Column1") %>' /> <br /> <asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false"> <LoggedInTemplate> <asp:LinkButton CssClass="DeleteButton" runat="server" ID="lbDelete" OnCommand="Delete" CommandArgument='<%# Eval("id") %>' ViewStateMode="Disabled">Delete</asp:LinkButton> </LoggedInTemplate> </asp:LoginView> </ItemTemplate> </asp:DataList> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" SelectCommand="SELECT [id],[name], [data], convert(varchar, [date], 101) FROM [Announcements] ORDER BY [date] DESC"> </asp:SqlDataSource> 添加到您的ID="lbDelete"(并且还为您更改了LinkButtonCLASS),这是在我们的代码中找到控件所需的:

CssClass

答案 1 :(得分:0)

您只需要DataKeyField来唯一标识您的行,以便执行删除操作。