为什么我的KendoUI网格没有显示我的数据,我是否错误地配置了Automapper?

时间:2017-08-31 10:12:47

标签: c# asp.net-mvc entity-framework kendo-ui automapper

我的KendoUI网格出现问题,它没有显示返回的数据。我正在使用存储库模式和automapper来提升使用视图模型的一些重要工作。

简而言之,我的控制器向存储库询问具有特定Id的所有记录,并将它们映射到视图模型以避免循环引用。集合存储在变量中,并作为json传递给视图中的网格。

问题在于,尽管返回了数据(可以通过断点观察),但网格从未显示任何内容,我无法弄清楚原因。

以下代码显示了我如何设置所有内容:

控制器

namespace DataAccessTest.Controllers
{
    public class GridController : Controller
    {
        private IFixturesRepository fixtureRepository;

        public GridController()
        {
            this.fixtureRepository= new FixturesRepository(new CoreEntities());
        }

        // GET: Grid
        public ActionResult Index()
        {
            return View();
        }
        // Id paramter is fed from a grid in a different view.
        public ActionResult fixtures([DataSourceRequest] DataSourceRequest request, int id)
        {
            //As the repository uses IQueryable I used .ProjectTo
            //which I read was the best way to handle it.
            var fixture = fixtureRepository.GetFixtures().Where(c => c.vessel_idx == id)
                .ProjectTo<FixturesViewModel>();                    
            return Json(fixture);
        }
    }
}

FixturesRepository

简洁缩短

namespace DataAccessTest.DAL
{
    public class FixturesRepository : IFixturesRepository, IDisposable
    {
        private CoreEntities context;
        public FixturesRepository(CoreEntities context)
        {
            this.context = context;
        }        
        public IQueryable<tbl_vessel_fixtures> GetFixtures()
        {
            return context.tbl_vessel_fixtures;
        }
        ...
    }
}

IFixturesRepository

namespace DataAccessTest.DAL
{
    public interface IFixturesRepository : IDisposable
    {
        IQueryable<tbl_vessel_fixtures> GetFixtures();
    }
}

KendoUI MVC网格

 @(Html.Kendo().Grid<DataAccessTest.ViewModels.FixturesViewModel>()
    .Name("fixtures")
    .Columns(columns =>
    {
        columns.Bound(c => c.vessel_idx)
            .Title("Vessel Id");
        columns.Bound(c => c.vessel_name)
            .Title("Name");
        columns.Bound(c => c.fixture_date)
            .Title("Date")
            .ClientTemplate("#=fixture_date ? kendo.toString(kendo.parseDate(fixture_date), 'dd/MM/yyyy') : '' #");
        columns.Bound(c => c.charterer_company)
            .Title("Charterer");
    })
    .Pageable()
    .Sortable(sort => sort.SortMode(GridSortMode.MultipleColumn))
    .Groupable()
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("fixtures", "Grid", new { id = Model.vessel_idx }))
        .PageSize(10)
        .Sort(sort => sort.Add(a => a.fixture_date).Descending())
        ))

Global.asax中

这是我启动自动播放器配置的地方。

    // Automapper
    Mapper.Initialize(cfg => cfg.CreateMap<FixturesViewModel, tbl_vessel_fixtures>().ReverseMap());

如果我不使用automapper并手动创建这个映射,那么它工作正常,但如果我尝试使用automapper,它会获取数据,但不会在网格中显示它。我不确定我的配置是否错误。

感谢。

1 个答案:

答案 0 :(得分:1)

好的,我发现了一些关于此类问题的其他详细信息(网格不返回数据)。这不是Automapper或方法本身的问题,我忘了做的是使用扩展方法.ToDataSourceResult。对方法稍作改动,我现在有了预期的数据。

public ActionResult fixtures([DataSourceRequest] DataSourceRequest request, int id)
{
    var fixture = fixtureRepository
        .GetFixtures()
        .Where(c => c.vessel_idx == id)
        .ProjectTo<FixturesViewModel>();

    var result = fixture.ToDataSourceResult(request);

    return Json(result);
}