Что вызывает мою ошибку ToDataSourceResult в моем основном приложении KendoUI? - PullRequest
0 голосов
/ 10 декабря 2018

Я создал приложение .NET Core с WebAPI и KendoUI.Я добавил общий репозиторий, когда я пытаюсь добавить источник данных в свою сетку кендо, я получаю сообщение об ошибке .ToDataSourceResult():

> делаетне содержат определения для «ToDataSourceResult» и лучшей перегрузки метода расширения «QueryableExtensions.ToDataSourceResult (DataTable, DataSourceRequest)» требует приемник типа «DataTable»

Я следовал документации Kendo для Core и WebApiчтобы завершить этот метод, но я не могу заставить его работать.Я приложил код из моего проекта, связанный с этой ошибкой и данными.

Контроллеры / HomeController

using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Microsoft.AspNetCore.Mvc;
using Senua.Interfaces;
using Senua.Models;
using System.Diagnostics;

namespace Senua.Controllers
{
    public class HomeController : Controller
    {
        private IVesselRepository service;

        public IActionResult Index()
        {
            return View();
        }
        [HttpGet]
        public DataSourceResult GetVessels([DataSourceRequest]DataSourceRequest request)
        {
            return service.GetAllVesselsAsync().ToDataSourceResult(request); <----Error appears here.
        }
        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }

    }
}

Просмотры / Home / Index

@(Html.Kendo().Grid<Senua.Models.Vessel>()
    .Name("vessel_grid")
    .Columns(columns =>
    {
        columns.Bound(p => p.Name);
    })
    .Pageable()
    .Filterable()
    .DataSource(dataSource =>
        dataSource
            .WebApi()
            .Events(events => events.Error("error_handler"))
            .Model(model =>
            {
                model.Id(p => p.Id);
            })
            .Read(read => read.Action("GetVessels", "Home"))
          ))

<script>
    function error_handler(e) {
        var errors = $.parseJSON(e.xhr.responseText);
        if (errors) {
            alert("Errors:\n" + errors.join("\n"));
        }
    }
</script>

DAL / VesselRepository

using Senua.Interfaces;
using Senua.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Senua.DAL
{
    public class VesselRepository : Repository<Vessel>, IVesselRepository
    {
        public VesselRepository(LocalContext repositoryContext)
            : base(repositoryContext)
        {
        }
        public async Task<IEnumerable<Vessel>> GetAllVesselsAsync()
        {
            var vessel = await FindAllAsync();
            return vessel.OrderBy(x => x.Name);
        }
}

Интерфейсы / IVesselRepository

using Senua.Models;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Senua.Interfaces
{
    public interface IVesselRepository
    {
        Task<IEnumerable<Vessel>> GetAllVesselsAsync();
        Task<Vessel> GetVesselByIdAsync(int Id);
        Task CreateVesselAsync(Vessel vessel);
        Task UpdateVesselAsync(Vessel vessel);
        Task DeleteVesselAsync(Vessel vessel);
    }
}

DAL/ Репозиторий

using Senua.Interfaces;
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace Senua.DAL
{
    public abstract class Repository<T> : IRepository<T> where T : class
    {
        protected LocalContext DbContext { get; set; }
        public Repository(LocalContext _context)
        {
            this.DbContext = _context;
        }
        public async Task<IEnumerable<T>> FindAllAsync()
        {
            return await this.DbContext.Set<T>().ToListAsync();
        }        
    }
}

Интерфейсы / IRepository

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace Senua.Interfaces
{
    public interface IRepository<T>
    {
        Task<IEnumerable<T>> FindAllAsync();
        Task<IEnumerable<T>> FindByConditionAsync(Expression<Func<T, bool>> expression);
        void Create(T entity);
        void Update(T entity);
        void Delete(T entity);
        Task SaveAsync();
    }
}

Мне нужны некоторые рекомендации по этому вопросу, я никогда раньше не устанавливал асинхронные репотак что это немного новое, насколько я вижу, все в порядке, и я проверил с почтальоном.Я заметил, что есть также ToDataSourceAsync, но, попробовав это, он тоже не сработал.

TIA

1 Ответ

0 голосов
/ 11 декабря 2018

Для ToDataSourceResult, это метод для IEnumerable.

Для GetAllVesselsAsync() возвращается задание.

Попробуйте код ниже

[HttpGet]
public async Task<DataSourceResult> GetVessels([DataSourceRequest]DataSourceRequest request)
{
    var result = await service.GetAllVesselsAsync();
    return result.ToDataSourceResult(request); 
}

Обновление

public class HomeController : Controller
{
    private IVesselRepository service;
    public HomeController(IVesselRepository service)
    {
        this.service = service;
    }
...