2014-12-18 3 views
1

У меня есть неприятная проблема с ObjectDataSource (связанная с DetailsView), которая не проверяет DeleteParameters для метода удаления (который я указал как в разметку и объект данных, требующий целого числа). Вот разметка:ObjectDataSource не смог найти не общий метод, который принимает параметры типа

<asp:ObjectDataSource ID="odsFrontPageBannerDetails" runat="server" DataObjectTypeName="FrontPage.Banner" DeleteMethod="DeleteFrontPageBanner" InsertMethod="InsertFrontPageBanner" SelectMethod="GetFrontPageBanner" UpdateMethod="UpdateFrontPageBanner" TypeName="FrontPage.BannersData"> 
    <DeleteParameters> 
     <asp:Parameter Name="idx" Type="Int32" /> 
    </DeleteParameters> 
    <SelectParameters> 
     <asp:ControlParameter ControlID="GridView1" Name="idx" PropertyName="SelectedValue" Type="Int32" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

и объект:

<DataObjectMethod(DataObjectMethodType.Delete, True)> _ 
Public Shared Function DeleteFrontPageBanner(ByVal idx As Integer) As Integer 
    Dim retval As Integer = 0 
    Dim iReturnCode As Integer = 0 
    Using conn As New SqlConnection(GetConnStr()) 
     Using cmd As New SqlCommand 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.CommandText = "FrontPage_BannerDelete" 
      cmd.Connection = conn 
      cmd.Parameters.AddWithValue("@idx", idx) 
      Try 
       conn.Open() 
       iReturnCode = cmd.ExecuteNonQuery 
       If iReturnCode >= 0 Then 
        retval = 1 
        LastErrorMsg = String.Empty 
       Else 
        Throw New DataException("Return code is: " & iReturnCode) 
       End If 
      Catch ex As Exception 
       LastErrorMsg = ex.Message 
       retval = 0 
      End Try 
     End Using 
    End Using 
    Return retval 
End Function 

и DetailsView разметки:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" CellPadding="4" DataSourceID="odsFrontPageBannerDetails" ForeColor="#333333" GridLines="None" Height="50px" Width="338px"> 
     <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
     <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" /> 
     <EditRowStyle BackColor="#999999" /> 
     <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" /> 
     <Fields> 
      <asp:BoundField DataField="idx" HeaderText="idx" ReadOnly="True" SortExpression="idx" /> 
      <asp:CheckBoxField DataField="Active" HeaderText="Active" SortExpression="Active" /> 
      <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
      <asp:BoundField DataField="BannerText" HeaderText="BannerText" SortExpression="BannerText" /> 
      <asp:BoundField DataField="BannerImage" HeaderText="Banner Image" SortExpression="BannerImage" /> 
      <asp:BoundField DataField="BannerLink" HeaderText="Go To Page Link" SortExpression="BannerLink" /> 
      <asp:BoundField DataField="BackgroundColor" HeaderText="Background Color" SortExpression="BackgroundColor" /> 
      <asp:BoundField DataField="BannerHeight" HeaderText="Banner Height" HtmlEncode="False" SortExpression="BannerHeight" /> 
      <asp:BoundField DataField="StartDate" DataFormatString="{0:MM/dd/yyyy}" HeaderText="Start Date" HtmlEncode="False" SortExpression="StartDate" /> 
      <asp:BoundField DataField="EndDate" DataFormatString="{0:MM/dd/yyyy}" HeaderText="End Date" HtmlEncode="False" SortExpression="EndDate" /> 
      <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" /> 
     </Fields> 
     <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
    </asp:DetailsView> 

Ошибка указывает на то, что DeleteParameters полностью игнорируются! (Я последовал пример прямо из видео-учебник и он работал отлично для автора)

ObjectDataSource «odsFrontPageBannerDetails» не смог найти , не универсальный метод «DeleteFrontPageBanner», который принимает параметры типа «FrontPage.Banner ».

Любые идеи? Я пробовал перестроить решение и страницу без везения!

После попытки всех комбинаций параметров я мог думать без успеха, я решил просто изменить метод удаления принять объект Frontpage.Banner и теперь он удаляет без ошибок - См изменить ниже:

<DataObjectMethod(DataObjectMethodType.Delete, True)> _ 
Public Shared Function DeleteFrontPageBanner(ByVal o As FrontPage.Banner) As Integer 
    Dim retval As Integer = 0 
    Dim iReturnCode As Integer = 0 
    Using conn As New SqlConnection(GetConnStr()) 
     Using cmd As New SqlCommand 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.CommandText = "FrontPage_BannerDelete" 
      cmd.Connection = conn 
      cmd.Parameters.AddWithValue("@idx", o.idx) 
      Try 
       conn.Open() 
       iReturnCode = cmd.ExecuteNonQuery 
       If iReturnCode >= 0 Then 
        retval = 1 
        LastErrorMsg = String.Empty 
       Else 
        Throw New DataException("Return code is: " & iReturnCode) 
       End If 
      Catch ex As Exception 
       LastErrorMsg = ex.Message 
       retval = 0 
      End Try 
     End Using 
    End Using 
    Return retval 
End Function 

По-прежнему хотелось бы объяснить, почему параметры удаления в разметке полностью игнорируются.

+0

Можете ли вы показать определение типа whcih держит ваш 'метод DeleteFrontPageBanner'? –

+0

MC9000

+0

Я попытался изменить целевую структуру на 3.5 и перекомпилировать (предлагается на другом форуме), но это не помогло. В приведенном выше коде я забыл добавить DataKeyNames = "idx" в detailView. Обновление и вставка работают отлично. Это похоже на ошибку в утилите конфигурации, но мне просто нужно знать правильную конфигурацию вручную для объекта ObjectDataSource. Я попытаюсь просто применить метод Delete во всем объекте (вместо целого), чтобы увидеть, работает ли это. – MC9000

ответ

0

Обычно источник данных объекта разрешает метод, основанный на именах параметров, в любом порядке и не проверяет типы данных.

Однако, если установлено свойство DataObjectTypeName, метод разрешается другим способом. ObjectDataSource ищет метод с именем, указанным в свойстве DeleteMethod, которое принимает один параметр типа, указанного в свойстве DataObjectTypeName. В этом случае имя параметра не имеет значения.

См here

+0

Вот что я подумал. Я не понимаю, почему примеры, показывающие методы Delete, имеют целочисленный параметр, хотя он не должен работать вообще, поскольку вам нужно указать тот же параметр, который используется в методах обновления и вставки. Идите фигуру. – MC9000

+0

Не знаете, какие примеры вы использовали, возможно, вы можете предоставить ссылку, но она, безусловно, документирована для работы таким образом в документах Microsoft. –

Смежные вопросы