2013-10-10 3 views
1

로컬 ASP.NET 페이지에 ObjectDataSource을 코딩하려고합니다.InvalidOperationException : ObjectDataSource가 매개 변수가있는 일반이 아닌 메서드를 찾을 수 없습니다.

MSDN의 도움말 파일을 읽으면 항상 내 머리를 긁적 거리며 정확하게 암시 할 수 있는지 궁금해집니다. 예를 들어 내 TypeName이 무엇이되어야하는지 잘 모르겠습니다 (비록 링크에 흥미로운 예가 있지만).

기본 사항을 익히면 더 깊은 곳으로 모험 할 것입니다. 내가 txtStartDatetxtEndDateddlStartTime 이름이있는 DropDownList 컨트롤의 숫자, ddlEndTime, ddlAction, ddlFilter1라는 이름의 TextBox 컨트롤을 가지고,이 페이지에서

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

:

내 *에서 .aspx 파일의 첫 번째 줄은 내 정의를 포함 , 및 ddlFilter2.

나는 또한 ObjectDataSource 다음과 같습니다

GridView 컨트롤이 * .aspx 페이지에있을 것입니다, 그리고 데이터를 표시하는 데 사용됩니다
<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> 

:

<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이 잘못 사용 되었습니까?

답변

5

ObjectDataSource에서 나는 당신이 TypeName을 잘못 사용하고 있다고 말할 것입니다. MSDN 기사에서 메서드를 반환하는 메서드가 아니라 메서드를 호스팅하는 클래스를 참조합니다.

한번에 변경 TypeName="System.Data.DataTable"TypeName="AcpServiceNS.Reporter"

+0

+1 여기에 경로를 (물품. 그 제안에 감사드립니다. 이제 'ObjectDataSource'dsReport '는 startDate, startTime, endDate, endTime, action1, filter1, filter2.와 같은 매개 변수를 가진 비 제너릭 메소드'Reporter.GetData '를 찾을 수 없습니다. – jp2code

+1

너 자신을 걷어차려고한다.) 메서드를 public으로 해보자. – Khan

+0

메서드를 public으로 설정하려고 시도했지만 도움이되지 않았다. 이 문제를 해결 한 것 (그리고 왜 설명 할 수 없는지)은 디자이너에서 마법사에서 항목을 선택하는 것이 었습니다. 내 ** ObjectDataSource **는 위에서 지적한'TypeName '과 완전히 똑같아 보이지만 HTML 대신 디자이너에서 처리하면 작동합니다. 그래서, 당신 말이 맞았어요! 감사. – jp2code

1

귀하의 유형 이름이 아래와 같이 서비스 유형을 표시해야합니다; 여기에 대한

   <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" 는 강력한 이름 ;-)

관련 문제