Настройка свойства чтения источника данных Kendo UI Grid с помощью обработчика в ASP.NET Core MVC с помощью Razor Pages - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Kendo UI для пакета ASP.NET Core MVC с веб-приложением Razor Pages, поэтому я пытаюсь использовать технику обработки для операций сервера сетки.

@(Html.Kendo().Grid<CustomerViewModel>()
        .Name("CustomersGrid")
        .Columns(columns =>
        {
            columns.Bound(x => x.CustomerId).Title("Student ID");
            columns.Bound(x => x.CustomerName).Title("Name");
        })
        .Pageable()
        .Sortable()
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(20)
            .ServerOperation(true)
            .Read(read => read.Url("/Customers?handler=Read")))
         )

Я посмотрел ввкладка сеть, и она делает правильный POST для http://localhost:5000/Customers?handler=Read, однако я не заканчиваю свою точку останова, и я получаю код состояния 400.

В коде страницы бритвы за методом Action названоOnPostReadAsync

Есть идеи, почему это не работает?В дополнение к .Url также попытался использовать read.Action и read.Route в свойстве .Read объекта DataSource.

Вот класс с методом действия:

public class IndexModel : PageModel
{
    private readonly ICustomerRepository _customerRepository;
    private readonly IMapper _mapper;

    public IndexModel(ICustomerRepository customerRepository, IMapper mapper)
    {
        _customerRepository = customerRepository;
        _mapper = mapper;
    }

    public IList<CustomerViewModel> Customers { get; set; }

    public async Task<IActionResult> OnPostReadAsync([DataSourceRequest] DataSourceRequest request)
    {
        // THIS IS WHERE I WANT IT TO GO FOR READ

        var customersFromDb = await _customerRepository.FilterAsync();
        return new JsonResult(_mapper.Map<IList<Customer>, IList<CustomerViewModel>>(customersFromDb).ToDataSourceResult(request));
    }
}

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Для меня использование POST для получения данных неверно.Если вы хотите использовать GET, добавьте .Type (HttpVerbs.Get) к вашему методу Read:

.DataSource(data =>
{
    data.Ajax()
      .Events(events => events.Error("grid_error"))
      .Read(read => read.Url("./Groups?handler=Read").Type(HttpVerbs.Get));
      //.Sort(sort => sort.Add("Name").Ascending())
      //.PageSize(20);
})

И сохраните ваш обычный метод Ajax, но в соглашении ожидается OnGet плюс значение, указанное в handler =...

public IActionResult OnGetRead([DataSourceRequest] DataSourceRequest request)
{
    var result = db.Queryable<IdentityRole>();
    return new JsonResult(result.ToDataSourceResult(request));
}

Стиль TagHelper похож:

<datasource type="DataSourceTagHelperType.Ajax" custom-type="AndyB.Identity.IdentityRole">
  <transport>
    <read url="./Groups?handler=Read" type="Get" />
  </transport>
  <sorts>
    <sort field="Name" direction="ascending" />
  </sorts>
</datasource>

Не используйте для вставки, обновления или удаления, продолжайте использовать POST

0 голосов
/ 24 января 2019

Возможно, вы уже делаете это, но я не видел этого в вашем коде.Помните, что на Razor Pages требуется жетон защиты от подделки.Вы можете добавить его в свою разметку следующим образом:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

И я добавил эту функцию, чтобы установить ее на dataSource запросах сетки:

$(function () {
    const requestVerificationToken = '@Xsrf.GetAndStoreTokens(HttpContext).RequestToken';
    const beforeSend = req => req.setRequestHeader('RequestVerificationToken', requestVerificationToken);
    const grid = $("#grid").getKendoGrid();
    grid.dataSource.transport.options.create.beforeSend = beforeSend;
    grid.dataSource.transport.options.update.beforeSend = beforeSend;
    grid.dataSource.transport.options.destroy.beforeSend = beforeSend;
});

Без этого токена все *Пользовательские обработчики 1008 * вернут 400 ошибок.

Ссылка: Предотвращение атак подделки межсайтовых запросов (XSRF / CSRF) в ASP.NET Core

...