在剑道网格上获取空引用;如何确定引发错误的原因

本文关键字:何确定 错误 网格 获取 引用 | 更新日期: 2023-09-27 17:56:45

我有一个剑道网格,我主要从一位同事那里复制(区别在于他们使用不同的表格作为他们的来源)和他的作品。他使用动态源而不是模型。

当我访问该页面时,网格没有出现。ReadCustomerNotes 操作有一个包含数据的数据表,所以这不是问题所在。我添加了一个 try-catch 块,现在收到错误"无法对空引用执行运行时绑定"。

我在网上找不到任何处理此错误和使用动态源的剑道网格。如何找出空引用的位置?我可以在 catch 块中放入一些东西来显示导致错误的原因吗?

这是我的代码:

AdminCustomerNotes.cshtml

@{
  ViewBag.Title = "AdminCustomerNotes";
 }
@using (Html.BeginForm("AdminCustomerNotes", "Admin"))
{
 @(Html.Kendo().Grid<dynamic>()
 .Name("Grid")
 .Columns(columns =>
  {
   foreach (System.Data.DataColumn column in Model.Columns)
   {
    switch (column.ColumnName)
    {
     case "customerNotes":
      columns.Bound(column.ColumnName);
     break;
    }
   }
  })
  .Pageable(x => x.PageSizes(new int[] { 10, 20, 30, 50 }).Refresh(true))
  .Sortable()
  .Filterable()
  .Groupable()
  .DataSource(dataSource => dataSource
  .Ajax()
  .Model(model =>
   {
    var id = Model.PrimaryKey[0].ColumnName;
    model.Id(id);
   })
  .Read(read => read.Action("ReadCustomerNotes", "Admin", new { customerID = int.Parse(ViewBag.compId.ToString()) })))
  .AutoBind(true)
 )
}
catch (Exception ex)
{
 @ex.Message;
}
}

管理员控制器.cs

    public ActionResult ReadCustomerNotes([DataSourceRequest] DataSourceRequest request, int customerID)
    {
        var customerNotes = CustomerNotes(false, customerID);
        return Json(customerNotes.ToDataSourceResult(request));
    }
    private DataTable CustomerNotes(bool init, int customerID)
    {
        try
        {
            return Rep.GetCustomerNotesByCustomerID(init ? 0 : customerID);
        }
        catch (Exception exception)
        {
            return null;
        }
    }

存储库.cs

public DataTable GetCustomerNotesByCustomerID(int customerID)
{
  try
  {
   var dt = new DataTable();
   dt.Columns.Add("customerNotesID", typeof(int));
   dt.Columns.Add("customerNotesDate", typeof(string));
   dt.Columns.Add("customerNotes", typeof(string));
   dt.PrimaryKey = new[]
   {
    dt.Columns["customerNotesID"]
   };
   var qry =
    from customerNotes in dat.tblCoNoteses
    where (
           customerNotes.CompId == customerID
          )
    select new
    {
        customerNotes.CoNotesId
     ,  customerNotes.CompId
     ,  customerNotes.Note 
     ,  customerNotes.AddBy
     , customerNotes.AddDate
     };
     foreach (var itm in qry)
     {
       var row = dt.NewRow();
       row["customerNotesID"] = itm.CoNotesId;
       row["customerNotesDate"] = string.IsNullOrEmpty(itm.AddDate.ToString()) ? "" : DateTime.Parse(itm.AddDate.ToString()).ToShortDateString();
       row["customerNotes"] = itm.Note;
       dt.Rows.Add(row);
     }
    return dt;
  }
 catch (Exception exception)
 {
   return null;
 }
}

在剑道网格上获取空引用;如何确定引发错误的原因

我认为在您的foreach (System.Data.DataColumn column in Model.Columns)语句中Model为空。 Model对视图顶部@model ...的引用,而不是网格的模型。

你可以做这样的事情(还没有测试过):

行动

public ActionResult AdminCustomerNotes() {
    var customerNotes = CustomerNotes(false, customerID);
    return View("AdminCustomerNotes", customerNotes);
}

视图

@model DataTable
@(Html.Kendo().Grid(Model)
    .Name("Grid")
    .Columns(columns =>
    {
        foreach (System.Data.DataColumn column in Model.Columns)
        {
            switch (column.ColumnName)
            {
                case "customerNotes":
                    columns.Bound(column.ColumnName);
                    break;
            }
        }
    })
    .Pageable(x => x.PageSizes(new int[] { 10, 20, 30, 50 }).Refresh(true))
    .Sortable()
    .Filterable()
    .Groupable()
)