使用Telerik Kendo Grid Read方法([DataSourceRequest])的ASP.NET Core 2.0不会在发布中调用

Tar*_*ati 11 c# asp.net-mvc telerik kendo-grid asp.net-core-2.0

我用Telerik Kendo UI和Asp.Net Core 2.0控件创建了一个应用程序.在本地,我们能够在Visual Studio 2017中无错误地运行相同的代码,但在本地IIS中发布后,它会给出以下错误(参见附图).

错误: - " http:// localhost:91/Masters/GetStateList 404(Not Found)".

在此输入图像描述

在检查错误时发现只调用了一个网格的Read方法(可能是由于'[DataSourceRequest] DataSourceRequest'参数)(其他动作方法完全被称为如下面的代码'GetRecordStatusList()')

控制器:

public class MastersController : Controller
{
    private IAllRepository<StateMaster> iAllStateRepository;

    public IActionResult StateMaster()
    {
        List<SelectListItem> statusList = new List<SelectListItem>() {
            new SelectListItem{Text = "Active", Value = "1" },
            new SelectListItem{Text = "Inactive", Value = "2" }
        };

        HttpContext.Session.SetInt32("UserId", 1);
        HttpContext.Session.SetString("UserName", "Admin");
        ViewBag.UserName = HttpContext.Session.GetString("UserName");

        return View();
    }

    //This action method is not called in published-code
    public ActionResult GetStateList([DataSourceRequest]DataSourceRequest request)
    {
        this.iAllStateRepository = new StateMasterRepository();
        var result = iAllStateRepository.GetModelList();
        var dsResult = result.ToDataSourceResult(request);
        return Json(dsResult);
    }

    public JsonResult GetRecordStatusList()
    {
        List<SelectListItem> statusList = new List<SelectListItem>() {
            new SelectListItem{Text = "Active", Value = "1" },
            new SelectListItem{Text = "Inactive", Value = "2" }
        };
        return Json(statusList);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这是View(StateMaster.cshtml)代码

<div class="row">
     @(Html.Kendo().Grid<Entity.MasterEntity.StateMaster>()
      .Name("StateGrid")
      .Columns(columns =>
      {
       columns.Bound(p => p.StateName).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).Operator("contains"))).Width(120);
       columns.Bound(p => p.Abbr).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).Operator("contains"))).Width(120).MinScreenWidth(800);
       columns.Command(command => { command.Edit(); command.Destroy(); }).Width(70);
      })
      .ToolBar(toolbar =>
      {
       toolbar.ClientTemplateId("toolbarStatus");
      })
      .NoRecords(e => e.Template("<div class='alert alert-warning' style='padding:3px'><h6 class='bold'><i>No data found!</i></h6></div>"))
      .Pageable(p => { p.Refresh(true); p.PageSizes(true); }).Navigatable()
      .Sortable(s => s.SortMode(GridSortMode.MultipleColumn)).Scrollable(s => s.Enabled(true))

      .HtmlAttributes(new { style = "height:100%;" })
      .DataSource(dataSource => dataSource
       .Ajax()
       .PageSize(10)
       .ServerOperation(true)
       .Model(m =>
       {
        m.Id(s => s.StateId);
        m.Field(f => f.StateName);
        m.Field(f => f.Abbr);
        m.Field(f => f.RecordStatus);
       })

       .Read(read => read.Action("GetStateList", "Masters"))

      )
      .Resizable(resize => resize.Columns(false))
     )
</div>
Run Code Online (Sandbox Code Playgroud)

下面的图片是开发的,它显示了网格的读取方法正常工作.

在开发环境中工作的图像

loa*_*ger 0

我遇到过一种情况,如果区域被映射到站点其他任何​​地方的路由中,有时会找不到控制器操作。要解决此问题,您可以通过执行以下操作来清理该区域:

  .DataSource(s => s.Ajax().Read(read => read.Action("GetStateList", "Masters", new {area = ""})))
Run Code Online (Sandbox Code Playgroud)

我还建议将该[HttpGet]属性添加到您的操作中。您可以通过在读取时指定 来强制 Kendo 使用它,.Type(HttpVerbs.Get)如下所示:

  .DataSource(s => s.Ajax().Read(read => read.Action("GetStateList", "Masters", new {area = ""}).Type(HttpVerbs.Get)))
Run Code Online (Sandbox Code Playgroud)