web-dev-qa-db-fra.com

Le type complexe devient nul dans un paramètre ApiController

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);
    }
});
50
will

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).

80
tpeczek

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);
    }
});
6
Shyju

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;
        }
    }
1
Bes Ley

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"];
}
1
graphicdivine