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

Posted

技术标签:

【中文标题】InvalidOperationException:ObjectDataSource 找不到具有参数的非泛型方法:【英文标题】:InvalidOperationException: ObjectDataSource could not find a non-generic method that has parameters: 【发布时间】:2013-10-10 15:45:39 【问题描述】:

我正在尝试为本地 ASP.NET 页面编写 ObjectDataSource。

阅读 MSDN 上的帮助文件总是让我摸不着头脑,想知道它们到底在暗示什么。例如,我不确定我的TypeName 应该是什么(尽管该链接有一个有趣的例子)。

一旦我掌握了基本工作,我将冒险进入更深的水域。

我的 *.aspx 文件的第一行包含我的定义:

<%@ Page Title="Reporter" Language="C#" MasterPageFile="~/local.Master"
    AutoEventWireup="true" CodeBehind="Reporter.aspx.cs"
    Inherits="AcpServiceNS.Reporter" %>

在这个页面中,我有名为 txtStartDatetxtEndDate 的 TextBox 控件以及一些名为 ddlStartTimeddlEndTimeddlActionddlFilter1ddlFilter2 的 DropDownList 控件。

我还有以下ObjectDataSource:

<asp:ObjectDataSource ID="dsReport" runat="server"
     SelectMethod="GetData"
     TypeName="System.Data.DataTable"
     ConvertNullToDBNull="True" >
  <SelectParameters>
    <asp:ControlParameter ControlID="txtStartDate" Name="startDate" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="ddlStartTime" Name="startTime" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="txtEndDate" Name="endDate" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="ddlEndTime" Name="endTime" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="ddlAction" Name="action1" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="ddlFilter1" Name="filter1" PropertyName="Text" Type="String" DefaultValue="" />
    <asp:ControlParameter ControlID="ddlFilter2" Name="filter2" PropertyName="Text" Type="String" DefaultValue="" />
  </SelectParameters>
</asp:ObjectDataSource>

GridView 控件将在 *.aspx 页面上,并将用于显示数据:

<asp:GridView ID="gvReport" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="true" Font-Size="Small" PageSize="30" Width="100%"
  OnRowDataBound="Report_RowDataBound"
  OnRowCommand="Report_RowCommand"
  DataKeyNames="Op_ID,Serial_Number,Date_Time,Test_Result"
  DataSourceID="dsReport"
  runat="server">
  <Columns>
    <asp:TemplateField HeaderText="Op_ID" HeaderStyle-Width="20%">
      <ItemTemplate>
        <asp:LinkButton ID="lbOp_ID" runat="server" CommandArgument='<%# Container.DataItemIndex %>' CommandName="Op_ID" />
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Serial_Number" HeaderStyle-Width="20%">
      <ItemTemplate>
        <asp:LinkButton ID="lbSerial_Number" runat="server" CommandArgument='<%# Container.DataItemIndex %>' CommandName="Serial_Number" />
      </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="Date_Time" HeaderText="Date_Time" SortExpression="Date_Time" HeaderStyle-Width="20%" />
    <asp:BoundField DataField="Test_Result" HeaderText="Test_Result" SortExpression="Test_Result" HeaderStyle-Width="40%" />
  </Columns>
</asp:GridView>

为了让它加载一个空数据集,我在我的代码隐藏中创建了这个简单的存根:

namespace AcpServiceNS 

  public partial class Reporter : System.Web.UI.Page 

    protected void Page_Load(object sender, EventArgs e) 
    

    [DataObjectMethod(DataObjectMethodType.Select)]
    protected static DataTable GetData(string startDate, string startTime, string endDate, string endTime,
      string action1, string filter1, string filter2) 
      var table = new DataTable();
      table.Columns.Add("Op_ID", typeof(string));
      table.Columns.Add("Serial_Number", typeof(string));
      table.Columns.Add("Date_Time", typeof(DateTime));
      table.Columns.Add("Test_Result", typeof(string));
      return table;
    

  


是的!以上内容基本上是一个表定义,但应该足以启动我的 *.aspx 页面。

当我尝试运行它时,我得到以下异常:

System.InvalidOperationException:ObjectDataSource 'dsReport' 找不到具有以下参数的非泛型方法 'GetData':startDate、startTime、endDate、endTime、action1、filter1、filter2。

看来我所有参数的拼写和大小写都正确,那么我做错了什么? TypeName是不是用错了?

【问题讨论】:

【参考方案1】:

对于ObjectDataSource,我会说是的,您使用TypeName 是错误的。在 MSDN 文章中,它指的是承载方法的类,而不是方法的返回类型。

尝试将TypeName="System.Data.DataTable" 更改为TypeName="AcpServiceNS.Reporter"

【讨论】:

+1。谢谢你的建议。现在我明白了:ObjectDataSource 'dsReport' could not find a non-generic method 'Reporter.GetData' that has parameters: startDate, startTime, endDate, endTime, action1, filter1, filter2. Confusing. 你会踢自己的 ;) 尝试制作方法public 我尝试将方法设置为public,但这没有帮助。似乎解决问题的方法(以及为什么我无法解释)是进入设计师并从向导中选择我的项目。我的 ObjectDataSource 看起来与您在上面指出的TypeName 完全一样,但是通过在设计器中而不是在 html 中执行它,它可以工作。所以,你是对的!谢谢。 很高兴你知道了。只是出于好奇,您为什么要尝试创建 ObjectDataSource?它看起来很老派。 嗯?我以为我正在学习新的方法。如果这些东西是旧的,那么什么是新的?【参考方案2】:

您的类型名称必须显示您的服务类型,如下所示;

                <asp:ObjectDataSource ID="odsPoint" runat="server" SortParameterName="sortColumns" EnablePaging="True" 
                    StartRowIndexParameterName="startRecord" MaximumRowsParameterName="maxRecords"
                    SelectCountMethod="GetCategoryPoints" SelectMethod="GetCategoryPointsByFilters" 
                    TypeName="EvaluationAssistt.Service.Services.EvaluationReportingService" 
                    UpdateMethod="GetCategoryPointsByFilters">

关心这里:TypeName="EvaluationAssistt.Service.Services.EvaluationReportingService" 你的服务方法在哪里写路径(比如强名;-)

【讨论】:

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

InvalidOperationException:未找到名为“Bearer”的 AuthorizationPolicy

为啥这个 OdbcConnection 会抛出 System.InvalidOperationException?

System.InvalidOperationException: '绑定实例已经被关联到监听

使用 PerformanceCounters 时获取 InvalidOperationException [关闭]

System.InvalidOperationException: 'XML 文档 (1, 1) 中存在错误。'

InvalidOperationException:LINQ 表达式“GroupByShaperExpression: