ListView DeleteMethod未传递DataKeyNames值

时间:2015-10-09 10:35:11

标签: c# asp.net listview

我有一个列表视图:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="NoteId" DeleteMethod="ListView1_DeleteItem" ItemType="NotesPractice.Note" SelectMethod="ListView1_GetData"
<ItemTemplate>          
    ...
    <asp:Button ID="btnDelete" CausesValidation="false" CommandName="Delete" runat="server" Text="Delete" />
    ...
 </ItemTemplate>
</asp:ListView>

DeleteMethod ListView1_DeleteItem

public void ListView1_DeleteItem(int id)
{
  System.Diagnostics.Debug.WriteLine("The id of button is: " + id);
  using (var db = new NotesContext())
  {
    var note = (from n in db.Notes
                   where n.NoteId == id
                   select n).Single();       
    db.Notes.Remove(note);
    db.SaveChanges();
  }

如果我查看浏览器控制台,我会看到此异常上升:

  

未捕获的Sys.WebForms.PageRequestManagerServerErrorException:   Sys.WebForms.PageRequestManagerServerErrorException:null的值   方法'Void'的非可空类型'System.Int32'的参数'id'   “NotesPractice._Default”中的ListView1_DeleteItem(Int32)'。可选的   参数必须是引用类型或可空类型。

这表明NoteId值(在DataKeyNames中指定)未到达delete方法,因此它抛出了异常。为什么没有任何数据到达方法?

我也尝试过显式指定DataKeyNames而没有运气:

DataKeyNames="NotesPractice.Note.NoteId"

以下是我的数据库的副本:

enter image description here

1 个答案:

答案 0 :(得分:2)

更改您的删除方法,如下所示: -

public void ListView1_DeleteItem(int NoteId)

模型绑定功能需要根据设计进行此操作。

  

id参数名称应与设置的DataKeyNames值匹配   控制

查看Dan Wahlin's博客了解详情。