【问题标题】:ASP.NET ObjectDataSource exception on pagination event分页事件上的 ASP.NET ObjectDataSource 异常
【发布时间】:2015-05-19 21:47:19
【问题描述】:

ASP.Net 在对 gridView 进行分页时抛出此错误。它可以很好地加载第一块元素,但是在单击任何页码时都会失败。我有一个实现 ViewAllEvents 的类似页面,它没有参数并且运行良好。所以我想这与参数添加部分代码隐藏有关。

ObjectDataSource 'pbpDataSource' could not find a non-generic method 'FindEvents' that has parameters: keywords, keywords1, count, start."} System.Exception {System.InvalidOperationException}

页面代码:

    <%@ Page Language="C#" MasterPageFile="~/Sportacus.Master" AutoEventWireup="true"
    Codebehind="ViewEvents.aspx.cs" Inherits="Es.Udc.DotNet.Sportacus.Web.Pages.Event.ViewEvents"
    meta:resourcekey="Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder_MenuExplanation"
    runat="server">
    -
    <asp:Localize ID="lclMenuExplanation" runat="server" meta:resourcekey="lclMenuExplanation" />
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder_BodyContent"
    runat="server">
    <form id="form1" runat="server">
        <asp:GridView ID="gvEvents" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None"
            AutoGenerateColumns="False" onpageindexchanging="gvEvents_PageIndexChanging" ShowHeaderWhenEmpty="true">
            <AlternatingRowStyle BackColor="White" />
            <EditRowStyle BackColor="#2461BF" />
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#EFF3FB" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
            <Columns>
                <asp:HyperLinkField DataNavigateUrlFields="Id" HeaderText="<%$ Resources:, hdrEventName %>" DataNavigateUrlFormatString="SingleEvent.aspx?evnId={0}" DataTextField="Name" />
                <asp:BoundField DataField="Category.catName" HeaderText ="<%$ Resources:, hdrCategoryName %>"/>
                <asp:BoundField DataField="Date" HeaderText ="<%$ Resources:, hdrEventDate %>"/>
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="pbpDataSource" runat="server"></asp:ObjectDataSource>
    </form>
</asp:Content>

代码背后:

using System;
using System.Web.Security;

using Es.Udc.DotNet.Sportacus.Web.HTTP.Session;
using Es.Udc.DotNet.ModelUtil.Exceptions;
using Es.Udc.DotNet.Sportacus.Model.UserService.Exceptions;
using System.Collections.Generic;
using Es.Udc.DotNet.Sportacus.Model.EventService;
using Microsoft.Practices.Unity;
using System.Web;
using System.Web.UI.WebControls;
using Es.Udc.DotNet.Sportacus.Web.Properties;
using System.Reflection;
using System.Data;


namespace Es.Udc.DotNet.Sportacus.Web.Pages.Event
{

    public partial class ViewEvents : SpecificCulturePage
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                pbpDataSource.ObjectCreating += this.PbpDataSource_ObjectCreating;
                pbpDataSource.TypeName =
                    Settings.Default.ObjectDS_Event_Service;

                pbpDataSource.EnablePaging = true;

                pbpDataSource.SelectMethod =
                    Settings.Default.ObjectDS_Event_SelectMethod;

                pbpDataSource.SelectCountMethod =
                    Settings.Default.ObjectDS_Event_SelectCountMethod;
                pbpDataSource.StartRowIndexParameterName = Settings.Default.Sportacus_startIndex;
                pbpDataSource.MaximumRowsParameterName = Settings.Default.Sportacus_count;

                long catId = Convert.ToInt32(Request.Params.Get("catId"));
                String keywords = Request.Params.Get("keywords");

                pbpDataSource.SelectParameters.Add("keywords", DbType.String, keywords);

                if (catId != -1)
                {
                    pbpDataSource.SelectParameters.Add("categoryId", DbType.Int64, catId.ToString());
                }


                gvEvents.AllowPaging = true;
                gvEvents.PageSize = Settings.Default.Sportacus_defaultCount;

                gvEvents.DataSource = pbpDataSource;
                gvEvents.DataBind();
            }
            catch (TargetInvocationException)
            {
                //TODO Etiqueta de error
            }

}
        protected void gvEvents_PageIndexChanging(object sender,GridViewPageEventArgs e)
        {
            gvEvents.PageIndex= e.NewPageIndex;
            gvEvents.DataBind();
        }    




        protected void PbpDataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            /* Get the Service */
            IUnityContainer container =
                (IUnityContainer)HttpContext.Current.
                    Application["unityContainer"];
            IEventService eventService = new EventService();

            eventService = (IEventService)container.BuildUp(eventService.GetType(), eventService, "IEventService");

            e.ObjectInstance = (IEventService)eventService;
            }

        }
    }

我没有发布配置文件,但它们经过了三重检查,所以这不应该是问题。

为什么页面要求关键字1?我该如何解决这个问题?

PS。不用担心 Method 不要求 catId 参数,Method 已重载,因此它可以使用或不使用该参数。

编辑: 堆栈跟踪

User code did not control System.InvalidOperationException
  HResult=-2146233079
  Message=ObjectDataSource 'pbpDataSource' could not find a non-generic method 'FindEvents' that has parameters: keywords, keywords1, count, start.
  Source=System.Web
  StackTrace:
       in System.Web.UI.WebControls.ObjectDataSourceView.GetResolvedMethodData(Type type, String methodName, IDictionary allParameters, DataSourceOperation operation)
       en System.Web.UI.WebControls.ObjectDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)
       en System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
       en System.Web.UI.WebControls.DataBoundControl.PerformSelect()
       en System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
       en System.Web.UI.WebControls.GridView.DataBind()
       en Es.Udc.DotNet.Sportacus.Web.Pages.Event.ViewEvents.Page_Load(Object sender, EventArgs e) en c:\Users\Trigork\Documents\Visual Studio 2013\Projects\Sportacus\Web\Pages\Event\ViewEvents.aspx.cs:line 61
       en System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
       en System.Web.UI.Control.OnLoad(EventArgs e)
       en System.Web.UI.Control.LoadRecursive()
       en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException: 

如果您想知道,第 61 行是 gvEvents.DataBind();

在抛出异常之前的Request.Params字符串

"keywords=a&catId=-1&__EVENTTARGET=ctl00%24ContentPlaceHolder_BodyContent%24gvEvents&__EVENTARGUMENT=Page%242&__VIEWSTATE=%2fwEPDwUKMTQ2NjcwNTU2NQ9kFgJmD2QWBAIJD2QWCAIFDw8WAh4HVmlzaWJsZWhkZAIHDw8WAh8AaGRkAgkPDxYCHwBoZGQCCw8PFgIfAGhkZAILD2QWAgIBD2QWBAIBDzwrABEDAA8WCB4LQWxsb3dQYWdpbmdnHghQYWdlU2l6ZQICHgtfIURhdGFCb3VuZGceC18hSXRlbUNvdW50AgNkARAWAQIBFgE8KwAFAQAWAh4KSGVhZGVyVGV4dAUKQ2F0ZWdvcsOtYRYBZgwUKwAAFgJmD2QWBgIBD2QWBmYPZBYCZg8PFgQeBFRleHQFDUJhcsOnYS1NYWRyaWQeC05hdmlnYXRlVXJsBRhTaW5nbGVFdmVudC5hc3B4P2V2bklkPTNkZAIBDw8WAh8GBQZGdXRib2xkZAICDw8WAh8GBRIwNi8wOC8yMDE1IDA6MDA6MDBkZAICD2QWBmYPZBYCZg8PFgQfBgUTQmFza2V0IHF1ZSB0ZSBjYWdhcx8HBRhTaW5nbGVFdmVudC5hc3B4P2V2bklkPTJkZAIBDw8WAh8GBQZCYXNrZXRkZAICDw8WAh8GBRIwOC8wNi8yMDE1IDA6MDA6MDBkZAIDDw8WAh8AaGRkAgMPD2QPEBYBZhYBFggeBE5hbWUFCGtleXdvcmRzHgZEYlR5cGULKWJTeXN0ZW0uRGF0YS5EYlR5cGUsIFN5c3RlbS5EYXRhLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4ORAeDERlZmF1bHRWYWx1ZQUBYR4OUGFyYW1ldGVyVmFsdWVkFgECA2RkGAEFLWN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcl9Cb2R5Q29udGVudCRndkV2ZW50cw88KwAMAQgCAmS8b0K%2fvi64Lbx%2fNz1XtOASXI%2f%2bXvPkYPQRF9btH03y7A%3d%3d&__EVENTVALIDATION=%2fwEdAALeVFTvnmTv0c3DzfBr2KnSl7v1kH35r4CKJ9pINf58%2bwkrHsyc7srY52vIBt2HtEPSwzWAi%2fkIjMHD2HPNVjjw&AspxAutoDetectCookieSupport=1&ASP.NET_SessionId=b5opxek5wofqswxdekptvvcw&.ASPXAUTH=5695CBAE7ED635548F37EC4DABD548CA6ECE2446D099EBCF528026246DF38E1F2F98E54CCA20C5EC6D354D71A78B084A9107C2BFF664D22D1CF0681B67FF825F659B64A325652376284FC680AC8518615F958A39528C61E944B9756B890B8B8E6D266DCDD72781CD31EF555C1EBEB42A530BC74A75DAE14DCDCAF702CDAFD224A16D1BB3CB0B224618B6CC920E6E7502&ALL_HTTP=HTTP_CACHE_CONTROL%3amax-age%3d0%0d%0aHTTP_CONNECTION%3akeep-alive%0d%0aHTTP_CONTENT_LENGTH%3a1224%0d%0aHTTP_CONTENT_TYPE%3aapplication%2fx-www-form-urlencoded%0d%0aHTTP_ACCEPT%3atext%2fhtml%2capplication%2fxhtml%2bxml%2capplication%2fxml%3bq%3d0.9%2cimage%2fwebp%2c*%2f*%3bq%3d0.8%0d%0aHTTP_ACCEPT_ENCODING%3agzip%2c+deflate%0d%0aHTTP_ACCEPT_LANGUAGE%3aes-ES%2ces%3bq%3d0.8%2cen%3bq%3d0.6%2cja%3bq%3d0.4%0d%0aHTTP_COOKIE%3aAspxAutoDetectCookieSupport%3d1%3b+ASP.NET_SessionId%3db5opxek5wofqswxdekptvvcw%3b+.ASPXAUTH%3d5695CBAE7ED635548F37EC4DABD548CA6ECE2446D099EBCF528026246DF38E1F2F98E54CCA20C5EC6D354D71A78B084A9107C2BFF664D22D1CF0681B67FF825F659B64A325652376284FC680AC8518615F958A39528C61E944B9756B890B8B8E6D266DCDD72781CD31EF555C1EBEB42A530BC74A75DAE14DCDCAF702CDAFD224A16D1BB3CB0B224618B6CC920E6E7502%0d%0aHTTP_HOST%3alocalhost%3a3404%0d%0aHTTP_REFERER%3ahttp%3a%2f%2flocalhost%3a3404%2fPages%2fEvent%2fViewEvents.aspx%3fkeywords%3da%26catId%3d-1%0d%0aHTTP_USER_AGENT%3aMozilla%2f5.0+(Windows+NT+6.2%3b+WOW64)+AppleWebKit%2f537.36+(KHTML%2c+like+Gecko)+Chrome%2f42.0.2311.152+Safari%2f537.36%0d%0aHTTP_ORIGIN%3ahttp%3a%2f%2flocalhost%3a3404%0d%0a&ALL_RAW=Cache-Control%3a+max-age%3d0%0d%0aConnection%3a+keep-alive%0d%0aContent-Length%3a+1224%0d%0aContent-Type%3a+application%2fx-www-form-urlencoded%0d%0aAccept%3a+text%2fhtml%2capplication%2fxhtml%2bxml%2capplication%2fxml%3bq%3d0.9%2cimage%2fwebp%2c*%2f*%3bq%3d0.8%0d%0aAccept-Encoding%3a+gzip%2c+deflate%0d%0aAccept-Language%3a+es-ES%2ces%3bq%3d0.8%2cen%3bq%3d0.6%2cja%3bq%3d0.4%0d%0aCookie%3a+AspxAutoDetectCookieSupport%3d1%3b+ASP.NET_SessionId%3db5opxek5wofqswxdekptvvcw%3b+.ASPXAUTH%3d5695CBAE7ED635548F37EC4DABD548CA6ECE2446D099EBCF528026246DF38E1F2F98E54CCA20C5EC6D354D71A78B084A9107C2BFF664D22D1CF0681B67FF825F659B64A325652376284FC680AC8518615F958A39528C61E944B9756B890B8B8E6D266DCDD72781CD31EF555C1EBEB42A530BC74A75DAE14DCDCAF702CDAFD224A16D1BB3CB0B224618B6CC920E6E7502%0d%0aHost%3a+localhost%3a3404%0d%0aReferer%3a+http%3a%2f%2flocalhost%3a3404%2fPages%2fEvent%2fViewEvents.aspx%3fkeywords%3da%26catId%3d-1%0d%0aUser-Agent%3a+Mozilla%2f5.0+(Windows+NT+6.2%3b+WOW64)+AppleWebKit%2f537.36+(KHTML%2c+like+Gecko)+Chrome%2f42.0.2311.152+Safari%2f537.36%0d%0aOrigin%3a+http%3a%2f%2flocalhost%3a3404%0d%0a&APPL_MD_PATH=%2fLM%2fW3SVC%2f8%2fROOT&APPL_PHYSICAL_PATH=C%3a%5cUsers%5cTrigork%5cDocuments%5cVisual+Studio+2013%5cProjects%5cSportacus%5cWeb%5c&AUTH_TYPE=Forms&AUTH_USER=Trigork&AUTH_PASSWORD=&LOGON_USER=Trigork&REMOTE_USER=Trigork&CERT_COOKIE=&CERT_FLAGS=&CERT_ISSUER=&CERT_KEYSIZE=&CERT_SECRETKEYSIZE=&CERT_SERIALNUMBER=&CERT_SERVER_ISSUER=&CERT_SERVER_SUBJECT=&CERT_SUBJECT=&CONTENT_LENGTH=1224&CONTENT_TYPE=application%2fx-www-form-urlencoded&GATEWAY_INTERFACE=CGI%2f1.1&HTTPS=off&HTTPS_KEYSIZE=&HTTPS_SECRETKEYSIZE=&HTTPS_SERVER_ISSUER=&HTTPS_SERVER_SUBJECT=&INSTANCE_ID=8&INSTANCE_META_PATH=%2fLM%2fW3SVC%2f8&LOCAL_ADDR=%3a%3a1&PATH_INFO=%2fPages%2fEvent%2fViewEvents.aspx&PATH_TRANSLATED=C%3a%5cUsers%5cTrigork%5cDocuments%5cVisual+Studio+2013%5cProjects%5cSportacus%5cWeb%5cPages%5cEvent%5cViewEvents.aspx&QUERY_STRING=keywords%3da%26catId%3d-1&REMOTE_ADDR=%3a%3a1&REMOTE_HOST=%3a%3a1&REMOTE_PORT=17999&REQUEST_METHOD=POST&SCRIPT_NAME=%2fPages%2fEvent%2fViewEvents.aspx&SERVER_NAME=localhost&SERVER_PORT=3404&SERVER_PORT_SECURE=0&SERVER_PROTOCOL=HTTP%2f1.1&SERVER_SOFTWARE=Microsoft-IIS%2f8.0&URL=%2fPages%2fEvent%2fViewEvents.aspx&HTTP_CACHE_CONTROL=max-age%3d0&HTTP_CONNECTION=keep-alive&HTTP_CONTENT_LENGTH=1224&HTTP_CONTENT_TYPE=application%2fx-www-form-urlencoded&HTTP_ACCEPT=text%2fhtml%2capplication%2fxhtml%2bxml%2capplication%2fxml%3bq%3d0.9%2cimage%2fwebp%2c*%2f*%3bq%3d0.8&HTTP_ACCEPT_ENCODING=gzip%2c+deflate&HTTP_ACCEPT_LANGUAGE=es-ES%2ces%3bq%3d0.8%2cen%3bq%3d0.6%2cja%3bq%3d0.4&HTTP_COOKIE=AspxAutoDetectCookieSupport%3d1%3b+ASP.NET_SessionId%3db5opxek5wofqswxdekptvvcw%3b+.ASPXAUTH%3d5695CBAE7ED635548F37EC4DABD548CA6ECE2446D099EBCF528026246DF38E1F2F98E54CCA20C5EC6D354D71A78B084A9107C2BFF664D22D1CF0681B67FF825F659B64A325652376284FC680AC8518615F958A39528C61E944B9756B890B8B8E6D266DCDD72781CD31EF555C1EBEB42A530BC74A75DAE14DCDCAF702CDAFD224A16D1BB3CB0B224618B6CC920E6E7502&HTTP_HOST=localhost%3a3404&HTTP_REFERER=http%3a%2f%2flocalhost%3a3404%2fPages%2fEvent%2fViewEvents.aspx%3fkeywords%3da%26catId%3d-1&HTTP_USER_AGENT=Mozilla%2f5.0+(Windows+NT+6.2%3b+WOW64)+AppleWebKit%2f537.36+(KHTML%2c+like+Gecko)+Chrome%2f42.0.2311.152+Safari%2f537.36&HTTP_ORIGIN=http%3a%2f%2flocalhost%3a3404"

根据用户@rism 的建议,我试图吞下InvalidOperationException,只是为了发现gridView gvEvents 即使在第一块结果中也没有出现

【问题讨论】:

  • 是否有一个FindEvents 方法接受关键字、计数、开始?那么也许是因为你Add 一个keywords 参数。可能已经有一个了。
  • 是的,有。正如我所说,第一个分页块显示正确,显示了该方法的结果。所以我知道关键字参数被正确添加。当我切换页面时发生此错误时,它会突然添加关键字1
  • 并非凭空而来。你打电话给pbpDataSource.SelectParameters.Add("keywords", DbType.String, keywords)。我敢打赌,你会在第一次之后发现,已经有一个keywords 参数。您正在添加第二个。
  • 所以 Page_Load 方法不只是刷新,它保持在先前调用中读取的参数?这可以解释事情。如果已经添加了关键字参数,有没有办法可以跳过添加关键字参数的步骤?
  • 1.发布堆栈跟踪。 2. 发布Request.Params.ToString()。 3. 您不会在寻找名为keywords 的参数,而是在寻找名为keywords1 的参数。听起来这是一个表单字段,在第二页上被添加了两次......可能与ViewState 挂断有关。在您的 html 视图源中查找名为 keywords1 的字段。如果您吞下异常并再次分页,您会收到关于 blah blah keywords, keywords1, keywords2 的错误吗?

标签: c# asp.net gridview pagination objectdatasource


【解决方案1】:

您应该编辑您的 Page_Load 以便在回发页面加载时(例如更改页面时)不重新添加参数关键字。

编辑:您在 Page_Load 上执行的所有操作都保留在页面内(在 ViewState 中),因此对某些代码部分使用 if (!IsPostBack) 是一种很好的做法。

【讨论】:

  • 谢谢,以前在 cmets 中建议过这样的答案,但这总结得很好,并提供了代码解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多