Команда удаления ListView и метод удаления ObjectDataSource работают неправильно - PullRequest
1 голос
/ 12 июля 2011

Я использую 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? здесь

Ответы [ 2 ]

1 голос
/ 24 июня 2014

По замыслу ObjectDataSource только что инициализированные значения ключевых полей в объекте передаются методу удаления. Если вы хотите, чтобы все значения были переданы, вы должны установить свойство conflictdetection="CompareAllValues" в ObjectDataSource

0 голосов
/ 12 июля 2011

Это потому, что вы не добавили Delete parameters к вашему ObjectDataSource.

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