ListView删除命令和ObjectDataSource删除方法不能正常工作
本文关键字:删除 常工作 工作 不能 命令 ObjectDataSource 方法 ListView | 更新日期: 2023-09-27 18:01:47
我使用ListView和ObjectDataSource。ListView的属性如下:
<asp:ListView ID="BookmarkManagerListView"
DataKeyNames="Id"
DataSourceID="BookmarkManager_Default_ObjectDataSource"
ItemPlaceholderID="ItemPlaceHolder"
OnItemDataBound="BookmarkManagerListView_ItemDataBound"
runat="server">
...
可以看到,我已经设置了DataKeyNames。Id是数据库中Bookmarks表的主键。我正在使用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)附加到我的类中,创建了我的数据上下文对象,我的删除方法如下所示:
[DataObjectMethod(DataObjectMethodType.Delete, true)]
public void DeleteBookmark(Model.Bookmark bookmark)
{
_dc.Bookmarks.Attach(bookmark);
_dc.Bookmarks.DeleteOnSubmit(bookmark);
_dc.SubmitChanges();
}
在listview中,在我的链接按钮上,我将命令设置为Delete,当我将断点设置为DeleteBookmark并单击链接按钮时,断点被激活,我可以开始逐步执行该代码。问题是,当我查看bookmark变量时,没有初始化任何内容,UserId是一个guid,看起来像这样:{0000000 -0000000 -0000000 -000000000000}。
问题:我如何得到listview和objectdatasource正确通信,以便当我点击我的链接按钮与命令的删除,参数为我的删除方法被正确初始化?我想我接近了,但一定是遗漏了什么。任何想法吗?
我发现这篇文章展示了如何做到这一点,但它使用的是GridView除了DataKeyNames上的Id还有一个时间戳。是一个时间戳需要,在listview,以及,还是特定于GridView?
根据设计,ObjectDataSource只是初始化了对象传递给delete方法中的关键字段值。如果您希望传递所有的值,您必须在ObjectDataSource
conflictdetection="CompareAllValues"
属性。这是因为您没有将Delete parameters
添加到ObjectDataSource
中。
<DeleteParameters>
<asp:Parameter Name="" Type="" />
</DeleteParameters>