2014-01-27 3 views
-2

을 제외한 모든 열을 정렬 또는 검색 할 때 Null 참조 예외가 발생합니다. 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; } 
} 

내가 정렬하거나 잘 작동 사용자 이름 열을 검색하려고하면 있지만 다른 컬럼에 내가 여기에 null 참조 예외를 얻을 :

당신이 breakpoint 설정해야 할 일은
  GridModel grid = new GridModel(set, vm.Count()); 
+0

'Table' 속성의 세터는 무엇을 설명 할 수 있습니까? 'Table = db.Users; '현재 값을 동일한 속성에 다시 할당하기 때문에 StackOverflow 예외가 발생합니다. –

+0

null을 반환하는 행은 무엇입니까? "set.Where.rules.Aggregate (rows, FilterGridSummary)" –

+0

테이블 속성은 테이블 db.users의 내용으로 DataSet을 채 웁니다. 내가 얻는 유일한 null은 : GridModel grid = new GridModel (set, vm.Count()); ' – Hydro

답변

0

보일

EMail = x.ContactInformation.EMail, 

예를 들어,이 라인 OIN이 오류가 발생합니다

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

을 나중에 대신이 PROPERT를 사용 : 메모리 특성 Email, SurnameRoleUserGridModel 객체의 목록

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())); 

빨리 당신이 가득 차있는 속성을 사용하여 코드를 수정하려면 : 이거 액세스 ContactInformation 및 모델에 존재로드하지 여부를 하나 Role1 특성하려고하는

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

, debugger을 실행/첨부하고, 각 변수를 검사하는 동안 코드를 단계별로 실행하여 중단 점에 break을 삽입하십시오. 참조로 사용되는 null 변수를 찾으십시오. x.ContactInformation에서 ContactInformation가 null의 경우 Visual Studio에서 디버깅에 JumpStart 필요한 경우, 당신은 당신의 테이블의 모든 데이터를 저장하는 here

+0

내가 어떻게해야하는지 알려주시겠습니까? – Hydro

관련 문제