2015-12-15 44 views
1

每當我加載網格而不添加布局時,父網格加載就好了。但是,無論何時添加布局,在將數據綁定到父級時都會引發NullReferenceException。當我添加布局時,爲什麼Ignite UI分層網格會拋出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; 
    } 

在GetData方法的BindParent方法中拋出錯誤。

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的可查詢,響應WrappedGridResponse,GridModel的baselayout) 在Infragistics.Web.Mvc.GridModel.RenderHierarchicalQueryable(IQueryable的可查詢) 在Infragistics.Web.Mvc.GridModel.DataBind() 在Infragistics.Web.Mvc.GridModel.GetData() 在IgniteUIHTMLEditorExample.Controllers.ServiceHistoryController.BindParent()在C:\用戶\ kyle.wingate \文件\ Visual Studio 2013 \ Projects \ IgniteUIHTMLEditorExample \ IgniteUIHTMLEditorEx在System.Web.Mvc的System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,對象[]參數) 上使用lambda_method(Closure,ControllerBase,Object []) 。 ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary的2 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的asyncResult,ActionInvocation innerInvokeState) 在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End() at System.Web.Mvc.Async.AsyncResultWrapper.End [TResult](IAsyncResult asyncResult,Object tag) 在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult的asyncResult) 在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() 在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters。 <> c__DisplayClass46.b__3f()

回答

2

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.PrimaryKeyGridColumnLayoutModel.ForeignKey,因爲GridModel.GetData依賴於它們來提取/過濾正確的子記錄。 我猜你的情況爲ServiceHistory佈局的配置應該是這樣的:

//… code omitted 
layout.ForeignKey = "ID"; 
layout.PrimaryKey = "LogID"; 
// … code omitted 

隨着這一變化的GridModel.GetData方法將在ServiceLog類的ID屬性過濾數據。

您可能需要更改GetServiceLogs方法來產生不同的ID,因爲現在它只會爲Service返回的數據與ID = 1

相關問題