2011-07-12 13 views
1

ListViewとObjectDataSourceを使用しています。 ListViewの属性は次のとおりです。ListView deleteコマンドとObjectDataSourceの削除メソッドが正しく動作しない

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

DataKeyNamesを設定しました。 Idは、データベース内のブックマークテーブルの主キーです。私はSQLにlinqを使用しています。テーブルのlinqクラス名はブックマークです。オブジェクトデータソースのselectメソッドが正常に動作し、リストに項目が表示されます。 deleteメソッドが正しく動作していません。以下は

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]; 

、私は宣言されたオブジェクトのデータソースリストしています::次のように

私のテーブル構造があり、私は私のObjectDataSourceクラスを作成しました

<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" /> 

を添付のDataObject(真)私のクラスに私のデータコンテキストオブジェクトを作成し、私のdeleteメソッドは次のようになります:

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

リストビューで、私のリンクボタンに私はコマンドを削除に設定して、DeleteBookmarkにブレークポイントを設定してリンクボタンをクリックすると、ブレークポイントがアクティブになり、そのコードをステップ実行することができます。問題はブックマーク変数を見て、何も初期化されず、GUIDであるUserIdは{00000000-0000-0000-0000-000000000000}のようになります。

質問リストビューとオブジェクトデータソースが正しく通信できるようにするには、deleteコマンドで自分のリンクボタンをクリックしたときに、deleteメソッドのパラメータが正しく初期化されるようにしますか?私は近づいていると思うが、何かが欠けているはずだ。何かご意見は?

これを行う方法を示す記事が見つかりましたが、GridView を使用し、DataKeyNamesのIDに加えてタイムスタンプもあります。タイムスタンプは、リストビューでも、またはGridViewに固有のタイムスタンプですか? here

答えて

0

その理由は、ObjectDataSourceDelete parametersを追加していないためです。

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

実際には、私はそれを信じていません。 DataObjectTypeNameをObjectDataSourceに追加したので、削除パラメータは必要ありません。実際に、私はちょうどそれを働かせました。私のListView属性DataKeyNamesでは、 "Id、CategoryId、TypeId、UserId、Title、Url"にchnagedして、今削除が機能しました。 DataObjectTypeNameとDeleteParametersを指定しなかった場合、ObjectDataSourceはパラメータなしでdeleteメソッドを見つけることができないという例外を受け取りました。まあ、それは実際に起こっていたし、DataObjectTypeNameを使用すると言っているウェブサイトに来た。 – developerdoug

+0

DataKeyNamesのすべての余分な列を指定しなければならないという奇妙なことですが、うまくいけば機能します。 – developerdoug

+0

DataKeyNamesで指定された余分なものでこれが動作する理由はありますか? – developerdoug

1

ObjectDataSourceは、オブジェクトのキーフィールド値を単に初期化することで、メソッドを削除します。すべての値を渡す場合は、ObjectDataSourceのconflictdetection="CompareAllValues"プロパティを設定する必要があります。

関連する問題