我的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,它会获取数据,但不会在网格中显示它。我不确定我的配置是否错误。
感谢。
答案 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);
}