Передача объекта через ObjectDataSource Asp.net Ошибка - PullRequest
1 голос
/ 22 марта 2011

Я работаю над школьным проектом и столкнулся с ошибкой, которая поставила меня в тупик. Я использую структуру сущностей, шаблон репозитория и источник данных объекта. Я получаю сообщение об ошибке, когда пытаюсь вставить вариант продукта, используя внешний ключ идентификатора продукта (который является параметром url).

Error

ObjectDataSource «ProductVariantObjectDataSource» не удалось найти неуниверсальный метод «InsertProductVariantByProductId», который принимает параметры типа «FV_ProductVariant».

Ссылка на изображение

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

Трассировка стека:

[InvalidOperationException: ObjectDataSource 'ProductVariantObjectDataSource' не удалось найти неуниверсальный метод 'InsertProductVariantByProductId', который принимает параметры типа 'FV_ProductVariant'.] System.Web.UI.WebControls.ObjectDataSourceView.GetResolvedMethodData (Тип тип, String methodName, Тип dataObjectType, Объект oldDataObject, Объект newDataObject, Операция DataSourceOperation) +1355789 System.Web.UI.WebControls.ObjectDataSourceView.ExecuteInsert (значения IDictionary) +339 System.Web.UI.DataSourceView.Insert (значения IDictionary, обратный вызов DataSourceViewOperationCallback) +89 System.Web.UI.WebControls.DetailsView.HandleInsert (строковая командаArg, логические причиныValidation) +379 System.Web.UI.WebControls.DetailsView.HandleEvent (EventArgs e, логические причиныValidation, строка проверки группы) +574 System.Web.UI.WebControls.DetailsView.OnBubbleEvent (Источник объекта, EventArgs e) +95 System.Web.UI.Control.RaiseBubbleEvent (Источник объекта, аргументы EventArgs) +37 System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent (Источник объекта, EventArgs e) +112 System.Web.UI.Control.RaiseBubbleEvent (Источник объекта, аргументы EventArgs) +37 System.Web.UI.WebControls.LinkButton.OnCommand (CommandEventArgs e) +125 System.Web.UI.WebControls.LinkButton.RaisePostBackEvent (String eventArgument) +169 System.Web.UI.WebControls.LinkButton.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 (логическое значение includeStagesBeforeAsyncPoint, логическое значение 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>

ProductBL, куда ObjectDataSource вставляется с

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

The 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 голосов
/ 22 марта 2011

Создание исходного объекта элемента управления ObjectDataSource

Если исходный объект для элемента управления ObjectDataSource предоставляет общедоступные статические методы (Shared в Visual Basic), которые можно вызывать для извлеченияи изменить данные, элемент управления 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;
    }
}
...