ObjectDataSource 找不到采用类型参数的非泛型方法

Posted

技术标签:

【中文标题】ObjectDataSource 找不到采用类型参数的非泛型方法【英文标题】:ObjectDataSource could not find a non-generic method that takes parameters of type 【发布时间】:2014-12-18 05:09:43 【问题描述】:

ObjectDataSource(绑定到 DetailsView)有一个令人烦恼的问题,它没有检查 DeleteParameters 的删除方法(我在标记和数据对象中都指定为需要整数)。 这是标记:

<asp:ObjectDataSource ID="odsFrontPageBannerDetails" runat="server" DataObjectTypeName="FrontPage.Banner" DeleteMethod="DeleteFrontPageBanner" InsertMethod="InsertFrontPageBanner" SelectMethod="GetFrontPageBanner" UpdateMethod="UpdateFrontPageBanner" TypeName="FrontPage.BannersData">
    <DeleteParameters>
        <asp:Parameter Name="idx" Type="Int32"  />
    </DeleteParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="GridView1" Name="idx" PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

和对象:

<DataObjectMethod(DataObjectMethodType.Delete, True)> _
Public Shared Function DeleteFrontPageBanner(ByVal idx As Integer) As Integer
    Dim retval As Integer = 0
    Dim iReturnCode As Integer = 0
    Using conn As New SqlConnection(GetConnStr())
        Using cmd As New SqlCommand
            cmd.CommandType = CommandType.StoredProcedure
            cmd.CommandText = "FrontPage_BannerDelete"
            cmd.Connection = conn
            cmd.Parameters.AddWithValue("@idx", idx)
            Try
                conn.Open()
                iReturnCode = cmd.ExecuteNonQuery
                If iReturnCode >= 0 Then
                    retval = 1
                    LastErrorMsg = String.Empty
                Else
                    Throw New DataException("Return code is: " & iReturnCode)
                End If
            Catch ex As Exception
                LastErrorMsg = ex.Message
                retval = 0
            End Try
        End Using
    End Using
    Return retval
End Function

和 detailsview 标记:

   <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" CellPadding="4" DataSourceID="odsFrontPageBannerDetails" ForeColor="#333333" GridLines="None" Height="50px" Width="338px">
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
        <EditRowStyle BackColor="#999999" />
        <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" />
        <Fields>
            <asp:BoundField DataField="idx" HeaderText="idx" ReadOnly="True" SortExpression="idx" />
            <asp:CheckBoxField DataField="Active" HeaderText="Active" SortExpression="Active" />
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:BoundField DataField="BannerText" HeaderText="BannerText" SortExpression="BannerText" />
            <asp:BoundField DataField="BannerImage" HeaderText="Banner Image" SortExpression="BannerImage" />
            <asp:BoundField DataField="BannerLink" HeaderText="Go To Page Link" SortExpression="BannerLink" />
            <asp:BoundField DataField="BackgroundColor" HeaderText="Background Color" SortExpression="BackgroundColor" />
            <asp:BoundField DataField="BannerHeight" HeaderText="Banner Height" htmlEncode="False" SortExpression="BannerHeight" />
            <asp:BoundField DataField="StartDate" DataFormatString="0:MM/dd/yyyy" HeaderText="Start Date" HtmlEncode="False" SortExpression="StartDate" />
            <asp:BoundField DataField="EndDate" DataFormatString="0:MM/dd/yyyy" HeaderText="End Date" HtmlEncode="False" SortExpression="EndDate" />
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" />
        </Fields>
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
    </asp:DetailsView>

错误表明 DeleteParameters 被完全忽略! (我直接从视频教程中学习了一个示例,对作者来说效果很好)

ObjectDataSource 'odsFrontPageBannerDetails' 找不到 采用以下参数的非泛型方法“DeleteFrontPageBanner” 输入“FrontPage.Banner”。

有什么想法吗?我尝试重建解决方案和页面,但没有成功!

在尝试了我能想到的所有参数组合都没有成功后,我决定只更改 delete 方法以接受 Frontpage.Banner 对象,现在它可以正确删除 - 请参阅下面的更改:

<DataObjectMethod(DataObjectMethodType.Delete, True)> _
Public Shared Function DeleteFrontPageBanner(ByVal o As FrontPage.Banner) As Integer
    Dim retval As Integer = 0
    Dim iReturnCode As Integer = 0
    Using conn As New SqlConnection(GetConnStr())
        Using cmd As New SqlCommand
            cmd.CommandType = CommandType.StoredProcedure
            cmd.CommandText = "FrontPage_BannerDelete"
            cmd.Connection = conn
            cmd.Parameters.AddWithValue("@idx", o.idx)
            Try
                conn.Open()
                iReturnCode = cmd.ExecuteNonQuery
                If iReturnCode >= 0 Then
                    retval = 1
                    LastErrorMsg = String.Empty
                Else
                    Throw New DataException("Return code is: " & iReturnCode)
                End If
            Catch ex As Exception
                LastErrorMsg = ex.Message
                retval = 0
            End Try
        End Using
    End Using
    Return retval
End Function

仍然希望解释为什么标记中的删除参数被完全忽略。

【问题讨论】:

你能显示持有你的DeleteFrontPageBanner方法的类型定义吗? 我尝试将目标框架更改为 3.5 并重新编译(在另一个论坛中建议),但这没有帮助。上面的代码,我确实忘记在 detailsView 上添加 DataKeyNames="idx​​"。更新和插入工作完美。它看起来像配置实用程序中的一个错误,但我只需要知道 ObjectDataSource 的正确手动配置。我将尝试让 Delete 方法接收整个对象(而不是整数),看看它是否有效。 好的,看起来您只能将同一个对象传递给所有方法,包括带有 ObjectDataSource 的删除方法。去图吧! 我不这么认为,我要问的是DeleteFrontPageBanner 方法是否驻留在FrontPage.BannersData 类中? 【参考方案1】:

通常,对象数据源将根据参数名称以任意顺序解析方法,而不检查数据类型。

但是,如果设置了 DataObjectTypeName 属性,则会以不同的方式解析该方法。 ObjectDataSource 查找具有在 DeleteMethod 属性中指定的名称的方法,该方法采用 DataObjectTypeName 属性中指定的类型的一个参数。在这种情况下,参数的名称无关紧要。

见here

【讨论】:

我就是这么想的。我不明白的是为什么显示 Delete 方法的示例具有一个整数参数,即使它根本不应该工作,因为您需要指定在 Update 和 Insert 方法中使用的相同参数。去图吧。 不确定您使用的是什么示例,也许您可​​以提供一个链接,但在 microsoft 文档中肯定记录了以这种方式工作。

以上是关于ObjectDataSource 找不到采用类型参数的非泛型方法的主要内容,如果未能解决你的问题,请参考以下文章

InvalidOperationException:ObjectDataSource 找不到具有参数的非泛型方法:

ASP.NET ObjectDataSource 找不到具有参数的非泛型方法

ObjectDataSource配合存储过程(采用数据集)的使用(删除可以解决,但是编辑出错好像它的方法也无法解决

GridView 与嵌套类的属性绑定

ObjectDataSource 未能找到带参数的非泛型方法

找不到与名为“用户”的控制器匹配的类型