У меня есть неприятная проблема с 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
По-прежнему хотелось бы объяснить, почему параметры удаления в разметке полностью игнорируются.
Можете ли вы показать определение типа whcih держит ваш 'метод DeleteFrontPageBanner'? –
Я попытался изменить целевую структуру на 3.5 и перекомпилировать (предлагается на другом форуме), но это не помогло. В приведенном выше коде я забыл добавить DataKeyNames = "idx" в detailView. Обновление и вставка работают отлично. Это похоже на ошибку в утилите конфигурации, но мне просто нужно знать правильную конфигурацию вручную для объекта ObjectDataSource. Я попытаюсь просто применить метод Delete во всем объекте (вместо целого), чтобы увидеть, работает ли это. – MC9000