54

パラメータ「ParametroFiltroFiltro」がnullになり、他のパラメータ「page」と「pageSize」がOKになる理由がわかりません。

public class ParametroFiltro
{
    public string Codigo { get; set; }
    public string Descricao { get; set; }
}

私のApiControllerGetメソッド:

public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize)

私の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);
    }
});
4

4 に答える 4

85

メソッドを使用して複雑なオブジェクトを送信しようとしていますGET。これが失敗する理由は、GETメソッドが本文を持つことができず、すべての値がURLにエンコードされているためです。を使用してこれを機能させることができます[FromUri]が、最初にクライアント側のコードを変更する必要があります。

$.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);
    }
});

このよう[FromUri]に、アクションメソッドを次のように変更すると、URLから複雑なオブジェクトのプロパティを直接取得できるようになります。

public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize)

以前のアプローチは、本文を持つことができるメソッドで機能します(ただし、本文をJSONとしてフォーマットPOSTするために使用する必要があります)。JSON.stringify()

于 2012-10-16T14:14:27.903 に答える
7

contentTypeajax呼び出しを行うときにプロパティを提供します。メソッドを使用JSON.stringifyして、投稿するJSONデータを作成します。タイプをに変更するPOSTと、MVCモデルバインディングにより、投稿されたデータがクラスオブジェクトにバインドされます。

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);
    }
});
于 2012-10-16T14:14:39.383 に答える
2

Newtonsoft.Json.LinqJObjectを介してPOST変数にアクセスすることもできます。

たとえば、このPOST:

$.ajax({
    type: 'POST',
    url: 'URL',
    data: { 'Note': note, 'Story': story },
    dataType: 'text',
    success: function (data) { }
});

次のようにAPIControllerでアクセスできます。

public void Update([FromBody]JObject data)
{
    var Note = (String)data["Note"];
    var Story = (String)data["Story"];
}
于 2016-02-09T08:43:24.433 に答える
1

クエリ文字列にjsonデータを追加し、後でWebAPI側で解析する場合。複雑なオブジェクトも解析できます。特にhttpget要件の特別な場合には、jsonオブジェクトを投稿するよりも便利です。

//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;
        }
    }
于 2013-05-14T10:11:01.857 に答える