Почему Ignite UI Hierarchical Grid создает исключение NullReferenceException при добавлении макета?
Всякий раз, когда я загружаю сетку без добавления макета, родительская сетка загружается просто отлично. Однако всякий раз, когда я добавляю макет, при связывании данных с родителем генерируется исключение NullReferenceException.
public ActionResult Index()
{
GridModel grid = GridLoadOnDemandModel();
grid.ID = "Services";
grid.LoadOnDemand = true;
grid.DataSourceUrl = this.Url.Action("BindParent");
grid.ColumnLayouts[0].DataSourceUrl = this.Url.Action("BindChild");
return View(grid);
}
private GridModel GridLoadOnDemandModel()
{
GridModel grid = new GridModel();
grid.AutoGenerateLayouts = false;
grid.AutoGenerateColumns = true;
grid.PrimaryKey = "ID";
grid.Width = "100%";
grid.Columns.Add(new GridColumn() { HeaderText = "Service ID", Key = "ID", DataType = "number" });
grid.Columns.Add(new GridColumn() { HeaderText = "Client ID", Key = "ClientID", DataType = "number" });
grid.Columns.Add(new GridColumn() { HeaderText = "Package ID", Key = "PackageID", DataType = "number" });
GridColumnLayoutModel layout = new GridColumnLayoutModel();
layout.Key = "ServiceHistory";
layout.ForeignKey = "ID";
layout.PrimaryKey = "ID";
layout.AutoGenerateColumns = false;
layout.Columns.Add(new GridColumn() { HeaderText = "Log ID", Key = "LogID", DataType = "number", Hidden = true });
layout.Columns.Add(new GridColumn() { HeaderText = "Service ID", Key = "ID", DataType = "number", Hidden = true});
layout.Columns.Add(new GridColumn() { HeaderText = "Client ID", Key = "ClientID", DataType = "number" });
layout.Columns.Add(new GridColumn() { HeaderText = "Package ID", Key = "PackageID", DataType = "number" });
layout.Width = "100%";
grid.ColumnLayouts.Add(layout);
return grid;
}
Ошибка генерируется в методе BindParent метода GetData.
public JsonResult BindParent()
{
GridModel model = GridLoadOnDemandModel();
model.DataSource = GetService().AsQueryable();
return model.GetData();
}
public JsonResult BindChild(string path, string layout)
{
GridModel model = GridLoadOnDemandModel();
model.DataSource = GetServiceLogs().AsQueryable();
return model.GetData(path, layout);
}
private IEnumerable<Service> GetService()
{
var services = new List<Service>();
for (int i = 0; i < 10; i++)
{
var service = new Service
{
ID = i,
ClientID = 1,
PackageID = 1
};
services.Add(service);
}
return services;
}
private IEnumerable<ServiceLog> GetServiceLogs()
{
var serviceLogs = new List<ServiceLog>();
for (int i = 0; i < 10; i++)
{
var serviceLog = new ServiceLog
{
LogID = i,
ID = 1,
ClientID = i,
PackageID = i
};
serviceLogs.Add(serviceLog);
}
return serviceLogs;
}
public class Service
{
public int ID { get; set; }
public int ClientID { get; set; }
public int PackageID { get; set; }
}
public class ServiceLog
{
public int LogID { get; set; }
public int ID { get; set; }
public int ClientID { get; set; }
public int PackageID { get; set; }
}
public class Service
{
public int ID { get; set; }
public int ClientID { get; set; }
public int PackageID { get; set; }
}
public class ServiceLog
{
public int LogID { get; set; }
public int ID { get; set; }
public int ClientID { get; set; }
public int PackageID { get; set; }
}
Вот трассировка стека:
в Infragistics.Web.Mvc.GridModel.RenderHierarchicalQueryableRecursive(IQueryable queryable, WrappedGridResponse response, GridModel baseLayout) в Infragistics.Web.Mvc.GridModel.RenderHierarchicalQuerygWridMataTygWind.Gyg_WidGableBataTygWind.GyTableBablegableGable.GyTableGable.GyTableGable.GyTableBablegableGable.Gyg_IgnB.GeB).Mvc.GridModel.GetData () в IgniteUIHTMLEditorExample.Controllers.ServiceHistoryController.BindParent() в c:\Users\kyle.wingate\Documents\Visual Studio 2013\Projects\IgniteUIHTMLEditorExample\IgniteUId_setup_setup_setup_setup_setup_setup_setup_setup_setup_setup_service_love_setup_setup_5 (Closure, ControllerBase, Object[]) в System.Web.Mvc.ActionMethodDispatcher.Execute(параметры ControllerBase, Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 параметра) в System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod() в System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asynWynWync.WynSyncWRynSync.WynSWRR_Rat_Sync.2.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.End() в System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, тег объекта) в System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncWesv)
as).Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() в System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<> C__DisplayClass46.b__3f()
1 ответ
В Service
класс / модель, вы должны иметь свойство, названное в честь GridColumnLayoutModel.Key
значение. Вот как Service
класс должен выглядеть так:
public class Service
{
public int ID { get; set; }
public int ClientID { get; set; }
public int PackageID { get; set; }
public IEnumerable<ServiceLog> ServiceHistory { get; set; }
}
Это изменение разрешит NullReferenceException
, но есть еще некоторые изменения, которые вам нужно внести, чтобы ваш пример работал как положено.
Вы также должны правильно настроить GridColumnLayoutModel.PrimaryKey
а также GridColumnLayoutModel.ForeignKey
, поскольку GridModel.GetData
зависит от них, чтобы извлечь / отфильтровать правильные дочерние записи. Я думаю, в вашем случае, конфигурация для ServiceHistory
макет должен выглядеть так:
//… code omitted
layout.ForeignKey = "ID";
layout.PrimaryKey = "LogID";
// … code omitted
С этим изменением GridModel.GetData
Метод отфильтрует данные по ID
недвижимость в ServiceLog
учебный класс.
Возможно, вам придется изменить GetServiceLogs
способ генерировать разные ID
потому что сейчас он вернет данные только за Service
с ID = 1