使用以下类加载/过滤/订购Kendo网格的最佳方法是什么?
域:
public class Car { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual bool IsActive { get; set; } }
视图模型
public class Carviewmodel { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string IsActiveText { get; set; } }
AutoMapper
Mapper.CreateMap<Car,Carviewmodel>() .ForMember(dest => dest.IsActiveText,src => src.MapFrom(m => m.IsActive ? "Yes" : "No"));
IQueryable的
var domainList = RepositoryFactory.GetCarRepository().GetAllQueryable();
DataSourceResult
var dataSourceResult = domainList.ToDataSourceResult<Car,Carviewmodel>(request,domain => Mapper.Map<Car,viewmodel>(domain));
格
...Kendo() .Grid<Carviewmodel>() .Name("gridCars") .Columns(columns => { columns.Bound(c => c.Name); columns.Bound(c => c.IsActiveText); }) .DataSource(dataSource => dataSource .Ajax() .Read(read => read.Action("ListGrid","CarsController")) ) .Sortable() .Pageable(p => p.PageSizes(true))
好的,网格第一次完美地加载,但是当我通过IsActiveText进行过滤/排序时,我得到以下消息:
Invalid property or field – ‘IsActiveText’ for type: Car
在这种情况下最好的方法是什么?
解决方法
有些事情似乎很奇怪你告诉Kendo UI为Carviewmodel制作一个网格
.Grid<Carviewmodel>()
并告诉它有一个IsActive列:
columns.Bound(c => c.IsActive);
public class Carviewmodel { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string IsActiveText { get; set; } }
我的猜测是,Kendo正在从Carviewmodel IsActiveText传递字段名称,但是在服务器上运行ToDataSourceResult()来反对没有该名称的属性的Car对象(一个IQueryable< Car>).映射发生在过滤&排序.
如果您希望在数据库中进行过滤和排序,那么在对数据库运行之前,您需要在IQueryable上调用.ToDataSourceResult().
如果您已经从DB中获取了所有的Car记录,那么您可以先通过做映射来解决这个问题,然后在IQueryable&Carviewmodel>上调用.ToDataSourceResult().