Поля DataSourceRequest не заполняются постом, запускаемым сеткой пользовательского интерфейса Kendo при вызове контроллера MVC - PullRequest
0 голосов
/ 13 сентября 2018

Я уже несколько дней ломаю голову, пытаясь настроить фильтрацию сайта сервера сетки для моего Angular 6 и Kendo UI. Когда я устанавливаю фильтр в пользовательском интерфейсе, я вижу данные в опубликованном теле сообщения, такие как «фильтр = элемент ~ содержит ~ 'SL -' & page = 1 & pageSize = 5», однако эта информация неправильно отображается на сайте контроллера MVC в объект DataSourceRequest Это мой угловой сервис

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Headers, Response, RequestOptions, RequestMethod } from '@angular/http';
import {
    toDataSourceRequestString,
    translateDataSourceResultGroups,
    translateAggregateResults,
    DataResult,
    DataSourceRequestState
} from '@progress/kendo-data-query';
import { GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';
import { Observable } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import { sampleProducts } from '../delivery-manager/products'
import { HttpHeaders } from '@angular/common/http';


@Injectable({
  providedIn: 'root'
})
export class DeliveryDataSvrService {
    private BASE_URL: string = 'GetDeliveryDetailsForGrid';
    //private BASE_URL: string = 'DeliveryManager/GetDeliveryDetailsForGrid';
    constructor(public http: HttpClient) {

    }

    public fetch(state: DataSourceRequestState): Observable<DataResult> {



        return this.http
            .post<DataResult>(this.BASE_URL, toDataSourceRequestString(state)) 
            .map((data: any) =>
                (<GridDataResult>{
                    data: data.Data,
                    total: data.Total,
                })
            )

    }
}

Это мой контроллер MVC

using DataAccess;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;

namespace KingspanAUGears.Controllers
{
    public class DeliveryManagerController : Controller

        [System.Web.Http.HttpPost]
        public ActionResult GetDeliveryDetailsForGrid( [DataSourceRequest] DataSourceRequest request)
        {
            // request is null for PageSize, Filters, Sorts 


            var ctx = new KingspanAUToolsEntities();
            var toReturn = ctx.TruckDriversJobDetails.Take(100).ToDataSourceResult(request);
            return Json(toReturn);

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы пробовали предложенные настройки? Вот снимок экрана с запросом, полученным с моей стороны, когда я набираю «s» в столбце «Имя» Фильтр сетки:

enter image description here

Content-Type в HttpHeaders должен быть 'application / x-www-form-urlencoded', а фильтры отображаются в соответствии с ожиданиями:

0 голосов
/ 13 сентября 2018

Функция DataQuery toDataSourceRequestString создает строку запроса, которая будет правильно проанализирована механизмом связывания модели DataSourceRequest в контроллере, и предполагается, что она будет использоваться с запросом GET:

Документация статья и пример

При необходимости, возможно, вы можете настроить службу данных Angular следующим образом, чтобы отправить состояние в запросе POST:

public fetch(state: DataSourceRequestState): Observable<any> {
    const queryStr = `${toDataSourceRequestString(state)}`; //serialize the state
    const hasGroups = state.group && state.group.length;

    const obj = toDataSourceRequest(state);
    const httpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    };

    return this.http
        .post(`${this.BASE_URL}`, queryStr, httpOptions) //send the state to the server         
        .map((res:any) => // process the response
            (<GridDataResult>{
                //if there are groups convert them to compatible format
                data: hasGroups ? translateDataSourceResultGroups(res.Data) : res.Data,
                total: res.Total,
                // convert the aggregates if such exists
                //aggregateResult: translateAggregateResults(aggregateResults)
            })
        )
}

Контроллер:

 [HttpPost]
    public JsonResult PostProducts([DataSourceRequest]DataSourceRequest request)
    {

        var result = Json(this.products.ToDataSourceResult(request));
        return result;
    }

    private IEnumerable products = new[] {
        new { ID = 1, Name = "Smith" },
        new { ID = 2, Name = "John" }
    };
...