ListView删除命令和ObjectDataSource删除方法无法正常工作

时间:2011-07-12 14:51:18

标签: c# asp.net objectdatasource delete-method

我正在使用ListView和ObjectDataSource。 ListView的属性如下:

<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类,将DataObject(true)附加到我的类,创建了我的数据上下文对象,我的delete方法如下所示:

[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正确通信,以便当我单击带有删除命令的链接按钮时,我的delete方法的参数被正确初始化?我想我已经接近但必须遗漏一些东西。有什么想法吗?

我发现这篇文章展示了如何做到这一点,但它使用的是GridView 除了DataKeyNames上的Id还有一个时间戳。在列表视图中是否需要时间戳,或者是特定于GridView的时间戳? here

2 个答案:

答案 0 :(得分:1)

通过设计ObjectDataSource只需将对象中的关键字段值传递给delete方法。如果要传递所有值,则必须在ObjectDataSource

上设置conflictdetection="CompareAllValues"属性

答案 1 :(得分:0)

因为您没有将Delete parameters添加到ObjectDataSource

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