c# jquery json kendo-ui servicestack

c# - No se puede deserializar la matriz mediante GET



jquery json (2)

La respuesta de Scott anterior es la correcta, pero aquí está mi solución más centrada en el servidor. Básicamente, reconstruyo manualmente el objeto SortTerm partir de la cadena de consulta. Esto es extensible a los otros parámetros específicos de Kendo, como Filtros y Grupos.

Codigo del cliente:

<html> <head> <meta charset="utf-8"> <title>Kendo UI Snippet</title> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="http://cdn.kendostatic.com/2014.1.528/js/kendo.all.min.js"></script> </head> <body> <script> var dataSource = new kendo.data.DataSource({ serverSorting: true, sort: [{ field: "ProductName", dir: "desc" }, { field: "Category", dir: "asc" }], serverPaging: true, page: 2, pageSize: 5, transport: { read: { url: "/products", dataType: "json" } } }); dataSource.fetch(function () { console.log(dataSource.view()); }); </script> </body> </html>

Código del servidor (en la implementación de AppHost) :

this.GlobalRequestFilters.Add((req, resp, dto) => { if (dto is KendoQueryBase) { KendoQueryBase qb = dto as KendoQueryBase; if (qb.Sort == null) qb.Sort = new List<SortTerm>(); Dictionary<string, string> qs = req.QueryString.ToDictionary(); var i = 0; while (qs.ContainsKey("sort[{0}][field]".Fmt(i))) { qb.Sort.Add(new SortTerm() { field = qs["sort[{0}][field]".Fmt(i)], dir = qs["sort[{0}][dir]".Fmt(i)] }); i++; } } });

Estoy usando el DataSource de la interfaz de usuario de Kendo para enviar información de clasificación a mi servicio ServiceStack. Sé que esto se ha solucionado si está utilizando POST , pero quiero adherirme a los diseños RESTful, por lo que el verbo de solicitud debe ser GET . Estoy usando este fragmento para probar con:

var dataSource = new kendo.data.DataSource({ serverSorting: true, sort: [{ field: "ProductName", dir: "desc" }, { field: "Category", dir: "asc"}], serverPaging: true, page: 2, pageSize: 5, transport: { read: { url: "/products", dataType: "json", contentType: "application/json", dataType: "jsonp" }, parameterMap: function (data, type) { //return kendo.stringify(data); //return JSON.stringify(data); //return $.param(data, true); //data.sort = kendo.stringify(data.sort); return data; } } }); dataSource.fetch(function () { console.log(dataSource.view()); });

Los parámetros de clasificación se convierten en una matriz dentada como:

sort[0][field]: ProductName sort[0][dir]: desc sort[1][field]: Category sort[1][dir]: asc

Mi solicitud de DTO es:

public class SortTerm { public string field { get; set; } public string dir { get; set; } } public class KendoQuery { public List<SortTerm> Sort { get; set; } public int Skip { get; set; } public int Take { get; set; } public int Page { get; set; } public int PageSize { get; set; } }

Todos los parámetros simples se deserializan, pero ¿cómo puedo transformar la propiedad Sort , ya sea del lado del cliente o del lado del servidor, para que se llene correctamente?

Tenga en cuenta que he probado una variedad de técnicas de serialización en la función parameterMap y estoy completamente perplejo.

EDITAR

Así que todo esto se reduce a: ¿Cómo paso una serie de objetos a través de $ .get () a un servicio de ServiceStack, cuando jQuery cuidadosamente reorganiza mi solicitud en una matriz dentada? Esto apesta a un filtro de solicitud, pero tengo que imaginar que ha sido resuelto antes para las solicitudes **GET** .


No puede usar estructuras de datos complejas, como la de la matriz de clasificación irregular, con una solicitud GET utilizando técnicas estándar porque las solicitudes JET GET solo admiten variables simples, ya que pueden traducirse para solicitar parámetros en la cadena de consulta. Entonces, la solicitud se formará correctamente para los parámetros simples ?Page=2&PageSize=5 ... pero para sort[0][field] esto no se puede especificar como un parámetro de solicitud de cadena de consulta.

Sin embargo, podría solucionar este problema si va a estructurar su objeto de criterio de búsqueda utilizando datasource.transport.parameterMap para que se pueda pasar como un parámetro, que luego se convierte en el servidor.

parameterMap: function (data, type) { // Convert the search criteria to a JSON string and store it on value sortJson data.sortJson = JSON.stringify(data.sort); // Remove the sort value, as this will be provided by sortJson delete data.sort; // Return the data return data }

En el servidor, deberá gestionar la conversión de la cadena JSON a la List<SortTerm> :

public class KendoQuery { List<SortTerm> sort; public List<SortTerm> Sort { get { // Handles deserialising the SortJson value if(sort == null) sort = ServiceStack.JsonSerializer.DeserializeFromString<List<SortTerm>>(SortJson); return sort; } } public string SortJson { get; set; } public int Skip { get; set; } public int Take { get; set; } public int Page { get; set; } public int PageSize { get; set; } }

Espero que esto ayude.