【问题标题】:What is causing my ToDataSourceResult error in my KendoUI Core Application?是什么导致我的 KendoUI 核心应用程序中出现 ToDataSourceResult 错误?
【发布时间】:2019-05-11 14:56:21
【问题描述】:

我使用 WebAPI 和 KendoUI 创建了一个 .NET Core 应用程序。我添加了一个通用存储库,当我尝试将数据源添加到我的 Kendo Grid 时,.ToDataSourceResult() 消息出现错误:

> 不包含对 'ToDataSourceResult' 和最佳扩展方法重载 'QueryableExtensions.ToDataSourceResult(DataTable,DataSourceRequest)' 需要“DataTable”类型的接收器

我按照 Core 和 WebApi 的 Kendo 文档完成了这个方法,但我无法让它工作。我已经附上了我的项目中与此错误和数据相关的代码。

控制器/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 });
        }

    }
}

观看次数/首页/索引

@(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

【问题讨论】:

    标签: asynchronous asp.net-core kendo-ui repository-pattern


    【解决方案1】:

    ToDataSourceResultIEnumerable 的方法。

    对于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;
        }
    

    【讨论】:

    • 感谢您的回答,解决方案部分有效。一旦我把这段代码放进去,我就会收到一个警告,private IVesselRepository service; 也永远不会被分配,因此总是会有 null 的值。我不确定为什么这是在方法var result = await service.GetAllVesselsAsync(); 中分配的。您对此有什么想法还是这是一个新问题?
    • @Yanayaya 你应该将IVesselRepository 注入HomeController 构造函数。
    • 当然,谢谢。我现在已经完成了,我可以看到数据正在返回到该方法。令人讨厌的是,网格没有填充,但正在返回数据 >:(
    • @Yanayaya 我建议开始一个新问题。
    • 网格未返回结果是因为缺少JsonOptions 行:services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddJsonOptions(options =&gt; options.SerializerSettings.ContractResolver = new DefaultContractResolver());
    【解决方案2】:

    这是我需要异步功能的 Kendo MVC Grid。 这是一个复杂的情况,您需要使用异步 DataSourceResult 来绑定来自 api 的网格数据:

    public class HomeController : Controller
    {
        private HttpClient _client = ApiHelper.Client;
        private Uri baseUri = ApiHelper._Client.BaseAddress;
    
        public ActionResult Index()
        {
            return View();
        }
    
        DataSourceResult result;
        JsonResult final;
        public async Task<ActionResult> GetList([DataSourceRequest] DataSourceRequest request)
        {
            int offset = 0;
            const int limit = 100;
            List<myModel> myModelList = new List<myModel>();
            using (var req = new HttpRequestMessage(HttpMethod.Get, baseUri + ConfigurationManager.AppSettings["V3BaseUri"] + "resource?offset=" + offset + "&limit=" + limit))
            using (var response = await ApiHelper.Client.SendAsync(req))
            {
                 response.EnsureSuccessStatusCode();
                    try
                    {
                        var content = response.Content.ReadAsStringAsync().Result;
                        myModelList = JsonConvert.DeserializeObject<List<myModel>>(content);
                        result = await myModelList.ToDataSourceResultAsync(request);
                        final = Json(result);
                        return final;
                    }
                    catch (Exception exc)
                    {
                        string message = exc.Message;
                        Console.WriteLine("Exception message: {0}", message);
                        throw;
                    }
                }
            }
    

    在我看来:

    @(Html.Kendo().Grid<Project.Models.myModel>()
                .Name("grid")
                .AutoBind(true)
                .Columns(columns =>
                {
                    columns.Bound(c => c.Id)
                      .Width(80).Title("Entity Id");
                    columns.Bound(c => c.NameOfInstitution);
                    columns.Bound(c => c.Addresses).ClientTemplate("#=generateAddress(Addresses)#").Title("Address");
                    columns.Bound(c => c.InstitutionTelephones).ClientTemplate("#=generatePhone(InstitutionTelephones)#").Title("Phone");
    
                })
                .HtmlAttributes(new { style = "height: 750px;" })
                .Scrollable()
                .Groupable()
                .Sortable()
                .Pageable()
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .PageSize(99)
                    .Read(read => read.Action("GetList", "Home"))
                ).NoRecords(x => x.Template("<div class='empty-grid'>NO RECORDS</div>")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 2011-06-29
      • 2021-02-21
      • 2021-09-22
      • 2011-06-08
      • 1970-01-01
      • 2021-04-08
      • 2014-03-30
      相关资源
      最近更新 更多