用以下类加载/过滤/订购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/

10-12 06:56