通过ObjectDataSource传递对象Asp.net错误

时间:2011-03-22 14:06:46

标签: asp.net entity-framework repository objectdatasource

我正在开展一个学校项目,我遇到了一个让我难过的错误。我正在使用实体框架,存储库模式和对象数据源。当我尝试使用产品ID外键(这是一个urlparameter)插入productvariant时,我发生了错误。

错误

ObjectDataSource'ProductVariantObjectDataSource'找不到带有'FV_ProductVariant'类型参数的非泛型方法'InsertProductVariantByProductId'。

链接到图片

http://i.stack.imgur.com/fJeR1.png

堆栈追踪:

[InvalidOperationException:ObjectDataSource'ProductVariantObjectDataSource'找不到带有'FV_ProductVariant'类型参数的非泛型方法'InsertProductVariantByProductId'。    System.Web.UI.WebControls.ObjectDataSourceView.GetResolvedMethodData(Type type,String methodName,Type dataObjectType,Object oldDataObject,Object newDataObject,DataSourceOperation operation)+1355789    System.Web.UI.WebControls.ObjectDataSourceView.ExecuteInsert(IDictionary values)+339    System.Web.UI.DataSourceView.Insert(IDictionary values,DataSourceViewOperationCallback callback)+89    System.Web.UI.WebControls.DetailsView.HandleInsert(String commandArg,Boolean causeValidation)+379    System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs e,Boolean causeValidation,String validationGroup)+574    System.Web.UI.WebControls.DetailsView.OnBubbleEvent(Object source,EventArgs e)+95    System.Web.UI.Control.RaiseBubbleEvent(Object source,EventArgs args)+37    System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(Object source,EventArgs e)+112    System.Web.UI.Control.RaiseBubbleEvent(Object source,EventArgs args)+37    System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e)+125    System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(String eventArgument)+169    System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+9    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+176    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563

aspx页面中的对象数据源

    <asp:ObjectDataSource ID="ProductVariantObjectDataSource" runat="server" 
    DataObjectTypeName="FV_ProductVariant" InsertMethod="InsertProductVariantByProductId" 
    SelectMethod="GetProductVariantByProductId" TypeName="ProductBL">
    <InsertParameters>
        <asp:Parameter Name="productVariant" Type="Object" />
        <asp:QueryStringParameter Name="productId" QueryStringField="ProductId" 
            Type="Int32" />
    </InsertParameters>
    <SelectParameters>
        <asp:QueryStringParameter Name="productId" QueryStringField="ProductId" 
            Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

使用

插入ObjectDataSource的ProductBL
    public void InsertProductVariantByProductId(FV_ProductVariant productVariant, int productId)
{
    try
    {
        productRepository.InsertProductVariantByProductId(productVariant, productId);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

IRepository

    void InsertProductVariantByProductId(FV_ProductVariant productVariant, int ProductId);

实际存储库

    public void InsertProductVariantByProductId(FV_ProductVariant productVariant, int productId)
{
    try
    {
        productVariant.ProductVariantId = GenerateProductVariantID();
        productVariant.ProductId = productId;
        context.FV_ProductVariant.AddObject(productVariant);
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

1 个答案:

答案 0 :(得分:0)

Creating an ObjectDataSource Control Source Object

  

如果ObjectDataSource控件的源对象公开可以调用以检索和修改数据的公共静态方法(在Visual Basic中为Shared),ObjectDataSource控件将直接调用这些方法。如果ObjectDataSource控件必须创建源对象的实例以进行方法调用,则该对象必须包含不带参数的公共构造函数。 ObjectDataSource控件在创建源对象的新实例时将调用此构造函数。

     

如果源对象不包含   没有的公共构造函数   参数,您可以创建一个实例   将使用的源对象   通过ObjectDataSource控件   ObjectCreating事件......

另外,尝试制作方法static

public static void InsertProductVariantByProductId(FV_ProductVariant productVariant, int productId)
{
    try
    {
        productRepository.InsertProductVariantByProductId(productVariant, productId);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}