是我在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());
你能解釋一下'Table'屬性的setter嗎? 'Table = db.Users;'它應該拋出StackOverflow異常,因爲你正在將當前值分配回相同的屬性 –
這行是否返回null? 「set.Where.rules.Aggregate(rows,FilterGridSummary)」 –
Table屬性用表db.users的內容填充DataSet。我得到的唯一的空格是:'GridModel grid = new GridModel(set,vm.Count());' – Hydro