用以下类加载/过滤/订购Kendo网格的最佳方法是什么:
域:
public class Car
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual bool IsActive { get; set; }
}
ViewModel
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"));
可查询的
var domainList = RepositoryFactory.GetCarRepository().GetAllQueryable();
数据源结果
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
进行过滤/排序时,会收到以下消息:在这种情况下最好的方法是什么?
最佳答案
似乎有些奇怪。您告诉Kendo UI为CarViewModel
创建网格
.Grid<CarViewModel>()
并告诉它有一个
IsActive
列:columns.Bound(c => c.IsActive);
但
CarViewModel
没有该名称的列: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()
,然后对数据库运行它。如果您已经从数据库中提取了所有的
Car
记录,则可以通过首先进行映射,然后在.ToDataSourceResult()
上调用IQueryable<CarViewModel>
来解决此问题。关于c# - 如何将Kendo UI Grid与ToDataSourceResult(),IQueryable <T>,ViewModel和AutoMapper一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16484417/