我有一个从ObjectDataSource填充的GridView,在其DataKeyNames字段中有两个项目。一个是主键ID,另一个是类别字段(类别字段用于添加标题行以描绘类别)。

显示效果很好,但是我正在尝试创建一个Delete Action 。即使我将对象定义为仅需要ID字段,该对象的delete方法也只需要ID字段,并且在ObjectDataSource中,.net提示说,因为它正在寻找一种同时具有在DataKeyNames中定义的两个字段的方法。

如果将类别的参数添加到delete方法中,它将起作用,但是定义一个没有任何用的参数很烦人。

我可以将ObjectDataSource和GridView对象配置为具有两个DataKeyNames值,但具体应将哪个值传递给哪些方法吗?

这两个对象的(简化)定义是:

<asp:ObjectDataSource ID="ObjDS1" runat="server" SelectMethod="getAllItems"
    TypeName="Items" DeleteMethod="deleteItem">
    <DeleteParameters>
        <asp:Parameter Name="ID" Type="Int32" />
       <!-- This shouldn't be necessary: -->
        <asp:Parameter Name="Category" Type="String" />
    </DeleteParameters>
</asp:ObjectDataSource>

<asp:GridView ID="gvJItems" runat="server" AutoGenerateColumns="False" DataKeyNames="ID,Category"
    DataSourceID="ObjDS1">
        <Columns>
            <asp:BoundField DataField="ID" Visible="false"  HeaderText="ID" />
            <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="85%"/>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbDelete" Runat="server"
                        OnClientClick="return confirm('Are you sure you want to delete this?');"
                            CommandName="Delete">Delete</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

最佳答案

所有DataKey值都将始终传递给Delete方法,因为由DataKeyNames命名的字段旨在用作在GridView中唯一标识该项目的一个或多个字段。如您在此处一样,它们经常用于不止于在ViewState中按行轻松维护额外字段的情况,但是这样做具有副作用,就像使用ObjectDataSource方法看到的那样。

要回答您的原始问题,不,您不能在没有将Category传递给Delete方法的情况下将Category包含在DataKeyNames中。不过,您可以通过将值放在“模板列”中的隐藏输入中来维护ViewState中的值。但是,获得该值要比忽略Delete方法的参数要耗费更多的工作。

关于asp.net - GridView中的多个DataKeyNames,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/326233/

10-12 06:41