Je ne sais pas pourquoi mon paramètre "ParametroFiltro Filtro" devient nul, les autres paramètres "page" et "pageSize" vont bien.
public class ParametroFiltro
{
public string Codigo { get; set; }
public string Descricao { get; set; }
}
Ma méthode ApiController Get:
public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize)
Mon appel ajax:
var fullUrl = "/api/" + self.Api;
$.ajax({
url: fullUrl,
type: 'GET',
dataType: 'json',
data: { Filtro: { Codigo: '_1', Descricao: 'TESTE' }, page: 1, pageSize: 10 },
success: function (result) {
alert(result.Data.length);
self.Parametros(result.Data);
}
});
Vous essayez d'envoyer un objet complexe avec la méthode GET
. La raison de cet échec est que la méthode GET
ne peut pas avoir de corps et que toutes les valeurs sont encodées dans l'URL. Vous pouvez faire fonctionner cela en utilisant [FromUri]
, Mais vous devez d'abord changer votre code côté client:
$.ajax({
url: fullUrl,
type: 'GET',
dataType: 'json',
data: { Codigo: '_1', Descricao: 'TESTE', page: 1, pageSize: 10 },
success: function (result) {
alert(result.Data.length);
self.Parametros(result.Data);
}
});
De cette façon, [FromUri]
Pourra récupérer vos propriétés d'objet complexe directement à partir de l'URL si vous modifiez votre méthode d'action comme ceci:
public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize)
Votre approche précédente préfère fonctionner avec la méthode POST
qui peut avoir un corps (mais vous devrez toujours utiliser JSON.stringify()
pour formater le corps en JSON).
Fournissez la propriété contentType
lorsque vous effectuez l'appel ajax. Utilisation JSON.stringify
méthode pour construire les données JSON à publier. changez le type en POST
et la liaison du modèle MVC liera les données publiées à votre objet de classe.
var filter = { "Filtro": { "Codigo": "_1", "Descricao": "TESTE" },
"page": "1", "pageSize": "10" };
$.ajax({
url: fullUrl,
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(filter),
success: function (result) {
alert(result.Data.length);
self.Parametros(result.Data);
}
});
Si vous ajoutez des données json à la chaîne de requête et les analysez plus tard du côté de l'API Web. vous pouvez également analyser un objet complexe. Il est utile plutôt que de publier un objet json, en particulier dans certains cas d'exigence httpget spéciaux.
//javascript file
var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
var request = JSON.stringify(data);
request = encodeURIComponent(request);
doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) {
window.console.log(result);
});
//webapi file:
[HttpGet]
public ResponseResult StartProcess()
{
dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
int userID = int.Parse(queryJson.UserID.Value);
string userName = queryJson.UserName.Value;
}
//utility function:
public static dynamic ParseHttpGetJson(string query)
{
if (!string.IsNullOrEmpty(query))
{
try
{
var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
json = System.Web.HttpUtility.UrlDecode(json);
dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);
return queryJson;
}
catch (System.Exception e)
{
throw new ApplicationException("can't deserialize object as wrong string content!", e);
}
}
else
{
return null;
}
}
Il est également possible d'accéder aux variables POST via un Newtonsoft.Json.Linq JObject.
Par exemple, ce POST:
$.ajax({
type: 'POST',
url: 'URL',
data: { 'Note': note, 'Story': story },
dataType: 'text',
success: function (data) { }
});
Peut être consulté dans un APIController comme ceci:
public void Update([FromBody]JObject data)
{
var Note = (String)data["Note"];
var Story = (String)data["Story"];
}