パラメータ「ParametroFiltro Filtro」がnullになり、他のパラメータ「page」と「pageSize」がOKになる理由はわかりません。
public class ParametroFiltro
{
public string Codigo { get; set; }
public string Descricao { get; set; }
}
私のApiController Getメソッド:
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);
}
});
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)
_
以前のアプローチは、ボディを持つことができるPOST
メソッドで動作します(ただし、JSON.stringify()
を使用してボディをJSONとしてフォーマットする必要があります)。
Ajax呼び出しを行うときにcontentType
プロパティを提供します。つかいます - 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);
}
});
JSONデータをクエリ文字列に追加し、後でWeb API側で解析する場合。複雑なオブジェクトも解析できます。特別な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;
}
}
Newtonsoft.Json.Linq JObjectを介して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"];
}