2011-07-12 36 views
1

我使用的是ListView和一個ObjectDataSource。 ListView的屬性如下:的ListView刪除命令和ObjectDataSource刪除方法工作不正常

<asp:ListView ID="BookmarkManagerListView" 
       DataKeyNames="Id" 
       DataSourceID="BookmarkManager_Default_ObjectDataSource" 
       ItemPlaceholderID="ItemPlaceHolder" 
       OnItemDataBound="BookmarkManagerListView_ItemDataBound" 
       runat="server"> 
    ... 

可以看到,我設置了DataKeyNames。 Id是我的書籤數據庫中的主鍵。我正在使用LINQ到SQL。該表的linq類名稱爲Bookmark。我的對象數據源上的select方法工作正常,並且列表中顯示了一些內容。刪除方法無法正常工作。

我的表結構如下:

CREATE TABLE [dbo].[Bookmarks](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [CategoryId] [int] NULL, 
    [TypeId] [int] NOT NULL, 
    [UserId] [uniqueidentifier] NOT NULL, 
    [Title] [varchar](200) NOT NULL, 
    [Url] [varchar](1500) NOT NULL, 
    CONSTRAINT [PK_Bookmarks] PRIMARY KEY CLUSTERED 
    (
    [Id] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]; 

下面,我列出我的聲明的對象數據來源:

<asp:ObjectDataSource ID="BookmarkManager_Default_ObjectDataSource" 
         DataObjectTypeNames="AppName.Model.Bookmark" 
         SelectMethod="SelectAll" 
         SelectCountMethod="GetSelectCount" 
         DeleteMethod="DeleteBookmark" 
         TypeName="AppName.WebApp.UserControls.Bookmark.BookmarkManagerObjectDataSource" 
         OnSelecting="ObjectDataSource_Default_Selecting" 
         OldValuesParameterFormatString="original_{0}" 
         SortParameterName="sortType" 
         EnablePaging="false" 
         StartRowIndexParameterName="startRowIndex" 
         MaximumRowsParameterName="maximumRows" 
         runat="server" /> 

我已經建立了我的ObjectDataSource類,附加數據對象(真)創建我的數據上下文對象,並且我的刪除方法如下所示:

[DataObjectMethod(DataObjectMethodType.Delete, true)] 
public void DeleteBookmark(Model.Bookmark bookmark) 
{ 
    _dc.Bookmarks.Attach(bookmark); 
    _dc.Bookmarks.DeleteOnSubmit(bookmark); 
    _dc.SubmitChanges(); 
} 

在列表視圖中,在我的鏈接按鈕上,我將命令設置爲刪除,並且當我將斷點設置爲DeleteBookmark並單擊鏈接按鈕時,斷點被激活,並且我可以開始單步執行該代碼。問題是當我查看書籤變量時,沒有任何內容被初始化,並且UserId是一個guid,如下所示:{00000000-0000-0000-0000-000000000000}。

問:我如何獲得ListView控件和ObjectDataSource這樣,當我點擊與刪除我的刪除方法的參數是正確的初始化命令我的鏈接按鈕,正常通信?我想我正在接近,但一定是錯過了一些東西。有什麼想法嗎?

我發現這篇文章說明了如何做到這一點,但是它使用GridView 以及DataKeyNames上的Id也有一個時間戳。在列表視圖中還需要一個時間戳,還是特定於GridView? here

回答

0

因爲您沒有將Delete parameters添加到您的ObjectDataSource

<DeleteParameters> 
     <asp:Parameter Name="" Type="" /> 
    </DeleteParameters> 
+1

設置conflictdetection="CompareAllValues"屬性實際上,我不相信這是它。因爲我已經將DataObjectTypeName添加到了我的ObjectDataSource中,所以不需要刪除參數。其實,我剛剛開始工作。在我的ListView屬性DataKeyNames中,我chnaged爲「Id,CategoryId,TypeId,UserId,Title,Url」,現在刪除工作。如果我沒有指定DataObjectTypeName並且沒有DeleteParameters,那麼我會收到異常,說ObjectDataSource不能找到沒有參數的刪除方法。那麼,那真的發生了,並且穿過一個網站說使用DataObjectTypeName。 – developerdoug

+0

奇怪的是我必須在DataKeyNames中指定所有的額外列,但是如果它能起作用的話。 – developerdoug

+0

有沒有一個原因,爲什麼現在可以使用DataKeyNames中指定的額外東西? – developerdoug

1

By design ObjectDataSource只是初始化鍵值對象中的對象傳遞給刪除方法。如果你希望所有的值傳遞,則必須在ObjectDataSource控件