2014-01-27 69 views
-2

是我在JQGrid中排序和搜索列的代碼。它在第一列工作正常,但我排序或搜索任何其他列時得到一個空引用異常,我似乎無法弄清楚爲什麼它這樣做。排序或搜索任何列時爲空引用異常,但用戶名爲

private PropmetEntities db = new PropmetEntities(); 

private DbSet<User> Table 
    { 
     get 
     { 
      return db.Users; 
     } 
     set 
     { 
      Table = db.Users; 
     } 
    } 

[PrivilegeFilter(priv = Privileges.UserView)] 
    public ActionResult Grid(GridSettings set) 
    { 

     //var raw = db.Users.AsQueryable(); 

     var vm = Table.Select(x => new UserGridModel() 
     //raw.OrderBy(x => x.Username).Select(x => new UserGridModel() 
     { 
      ID = x.ID, 
      Username = x.Username, 
      EMail = x.ContactInformation.EMail, 
      Surname = x.ContactInformation.Surname, 
      Role = x.Role1.Description 
     }).ToList().AsQueryable(); 
     ApplyGridSummarySettingsToGrid(set, ref vm); 

     GridModel grid = new GridModel(set, vm.Count()); 
     grid.rows = vm.Skip((set.PageIndex - 1) * set.PageSize).Take(set.PageSize).ToList(); 
     return Json(grid, JsonRequestBehavior.AllowGet); 
    } 

public void ApplyGridSummarySettingsToGrid(GridSettings set, ref IQueryable<UserGridModel> rows) 
    { 
     if (set.IsSearch) 
     { 
      rows = set.Where.rules.Aggregate(rows, FilterGridSummary); 
     } 
     rows = rows.OrderBy(x => x.Username); 
     SortGrid(set, ref rows); 
    } 

public IQueryable<UserGridModel> FilterGridSummary(IQueryable<UserGridModel> rows, MvcJqGrid.Rule rule) 
    { 
     switch (rule.field) 
     { 
      case "Username": return rows.Where(x => x.Username.ToLower().Contains(rule.data.ToLower())); 
      case "EMail": return rows.Where(x => x.ContactInformation.EMail.ToLower().Contains(rule.data.ToLower())); 
      case "Surname": return rows.Where(x => x.ContactInformation.Surname.ToLower().Contains(rule.data.ToLower())); 
      case "Role": return rows.Where(x => x.Role1.Description.ToLower().Contains(rule.data.ToLower())); 
      default: 
       return rows; 
     } 
    } 

private void SortGrid(GridSettings set, ref IQueryable<UserGridModel> rows) 
    { 
     if (set.SortOrder == "asc") 
     { 
      switch (set.SortColumn) 
      { 
       case "Username": 
        rows = rows.OrderBy(x => x.Username); 
        break; 
       case "EMail": 
        rows = rows.OrderBy(x => x.ContactInformation.EMail); 
        break; 
       case "Surname": 
        rows = rows.OrderBy(x => x.ContactInformation.Surname); 
        break; 
       case "Role": 
        rows = rows.OrderBy(x => x.Role1.Description); 
        break; 
       default: 
        rows = rows.OrderBy(x => x.Username).ThenBy(x => x.ID); 
        break; 
      } 
     } 
     else 
     { 
      switch (set.SortColumn) 
      { 
       case "Username": 
        rows = rows.OrderByDescending(x => x.Username); 
        break; 
       case "EMail": 
        rows = rows.OrderByDescending(x => x.ContactInformation.EMail); 
        break; 
       case "Surname": 
        rows = rows.OrderByDescending(x => x.ContactInformation.Surname); 
        break; 
       case "Role": 
        rows = rows.OrderByDescending(x => x.Role1.Description); 
        break; 
       default: 
        rows = rows.OrderByDescending(x => x.Username).ThenBy(x => x.ID); 
        break; 
      } 
     } 
    } 

public class UserGridModel 
{ 
    public int ID { get; set; } 
    public string Username {get; set;} 
    public string EMail { get; set; } 
    public string Surname { get; set; } 
    public string Role { get; set; } 
    public ContactInformation ContactInformation { get; set; } 
    public Role Role1 { get; set; } 
} 

如果我嘗試進行排序或搜索用戶名欄目,它工作正常,但在任何其他專欄中,我在這裏得到一個空引用異常:

  GridModel grid = new GridModel(set, vm.Count()); 
+0

你能解釋一下'Table'屬性的setter嗎? 'Table = db.Users;'它應該拋出StackOverflow異常,因爲你正在將當前值分配回相同的屬性 –

+0

這行是否返回null? 「set.Where.rules.Aggregate(rows,FilterGridSummary)」 –

+0

Table屬性用表db.users的內容填充DataSet。我得到的唯一的空格是:'GridModel grid = new GridModel(set,vm.Count());' – Hydro

回答

0

您保存您的表中的所有數據在內存具有性能EmailSurnameRoleUserGridModel對象列表:

new UserGridModel()   
{ 
    ID = x.ID, 
    Username = x.Username, 
    EMail = x.ContactInformation.EMail, 
    Surname = x.ContactInformation.Surname, 
    Role = x.Role1.Description 
} 

後來,而不是使用這些PROPERT IES您試圖訪問ContactInformationRole1特性,這要麼不裝或不存在在你的模型:

case "EMail": return rows.Where(x => x.ContactInformation.EMail.ToLower().Contains(rule.data.ToLower())); 
case "Surname": return rows.Where(x => x.ContactInformation.Surname.ToLower().Contains(rule.data.ToLower())); 
case "Role": return rows.Where(x => x.Role1.Description.ToLower().Contains(rule.data.ToLower())); 

要解決你的代碼快速只需使用您填寫屬性:

case "EMail": return rows.Where(x => x.EMail.ToLower().Contains(rule.data.ToLower())); 
case "Surname": return rows.Where(x => x.Surname.ToLower().Contains(rule.data.ToLower())); 
case "Role": return rows.Where(x => x.Role.ToLower().Contains(rule.data.ToLower())); 

但請記住,在這裏你遇到了很大的問題 - 你將整個表格轉儲到內存中,然後過濾列表並選擇數據頁面。這應該在數據庫方面完成。

0

你需要做的是建立一個breakpoint什麼,在您的斷點處運行/附加debugger以及當您break時,在檢查每個變量的同時遍歷代碼。尋找一個null變量,用作參考。例如,如果ContactInformationx.ContactInformation爲空,你會得到錯誤OIN此行

EMail = x.ContactInformation.EMail, 

如果您需要在Visual Studio調試的JumpStart,看here

+0

你可以給我一個我應該怎麼做的例子嗎? – Hydro