1

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に固有のタイムスタンプですか? ここ

4

2 に答える 2

1

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

于 2014-06-24T15:48:30.797 に答える
0

Delete parametersを に追加しなかったためですObjectDataSource

 <DeleteParameters>
        <asp:Parameter Name="" Type="" />
  </DeleteParameters>
于 2011-07-12T15:06:13.977 に答える