Я использую ListView и ObjectDataSource. Атрибуты ListView следующие:
<asp:ListView ID="BookmarkManagerListView"
DataKeyNames="Id"
DataSourceID="BookmarkManager_Default_ObjectDataSource"
ItemPlaceholderID="ItemPlaceHolder"
OnItemDataBound="BookmarkManagerListView_ItemDataBound"
runat="server">
...
Как видно, я установил DataKeyNames. Идентификатор является первичным ключом моей таблицы закладок в БД. Я использую 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();
}
В представлении списка на кнопке ссылки у меня установлена команда «Удалить», и когда я устанавливаю точку останова на DeleteBookmark и нажимаю кнопку ссылки, активируется точка останова, и я могу начать переходить по этому коду. Проблема в том, что когда я смотрю на переменную закладки, ничего не инициализируется, а UserId, который является guid, выглядит следующим образом: {00000000-0000-0000-0000-000000000000}.
Вопрос: Как заставить список и источник данных источника взаимодействовать правильно, чтобы при нажатии на кнопку ссылки с командой удаления, чтобы параметр для моего метода удаления был инициализирован правильно? Я думаю, что приближаюсь, но, должно быть, чего-то не хватает. Есть мысли?
Я нашел эту статью, которая показывает, как это сделать, но она использует GridView
и в дополнение к идентификатору на DataKeyNames также есть отметка времени. Нужна ли временная метка, в виде списка, или она специфична для GridView?
здесь