ListViewとObjectDataSourceを使用しています。ListViewの属性は次のとおりです。
<asp:ListView ID="BookmarkManagerListView"
DataKeyNames="Id"
DataSourceID="BookmarkManager_Default_ObjectDataSource"
ItemPlaceholderID="ItemPlaceHolder"
OnItemDataBound="BookmarkManagerListView_ItemDataBound"
runat="server">
...
ご覧のとおり、DataKeyNamesを設定しました。Idは、データベース内のブックマークテーブルの主キーです。linqtosqlを使用しています。テーブルの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クラスを作成し、DataObject(true)をクラスに追加し、データコンテキストオブジェクトを作成しました。deleteメソッドは次のようになります。
[DataObjectMethod(DataObjectMethodType.Delete, true)]
public void DeleteBookmark(Model.Bookmark bookmark)
{
_dc.Bookmarks.Attach(bookmark);
_dc.Bookmarks.DeleteOnSubmit(bookmark);
_dc.SubmitChanges();
}
リストビューで、リンクボタンのコマンドをDeleteに設定し、ブレークポイントをDeleteBookmarkに設定してリンクボタンをクリックすると、ブレークポイントがアクティブになり、そのコードのステップ実行を開始できます。問題は、ブックマーク変数を見ると、何も初期化されておらず、GUIDであるUserIdが{00000000-0000-0000-0000-000000000000}のようになっていることです。
質問:listviewとobjectdatasourceを正しく通信させて、deleteコマンドでリンクボタンをクリックすると、deleteメソッドのパラメーターが正しく初期化されるようにするにはどうすればよいですか?近づいていると思いますが、何かが足りないに違いありません。何かご意見は?
これを行う方法を示すこの記事を見つけましたが、GridViewを使用し、DataKeyNamesのIDに加えてタイムスタンプもあります。リストビューでもタイムスタンプが必要ですか、それともGridViewに固有のタイムスタンプですか? ここ