Сложный тип получает значение null в параметре ApiController
Я не знаю, почему мой параметр "ParametroFiltro Filtro" получает нуль, остальные параметры "страница" и "pageSize" становятся все в порядке.
public class ParametroFiltro
{
public string Codigo { get; set; }
public string Descricao { get; set; }
}
Мой метод Get 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);
}
});
Ответы
Ответ 1
Вы пытаетесь отправить сложный объект с помощью метода 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).
Ответ 2
Предоставьте свойство contentType
, когда вы делаете вызов ajax. Используйте 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);
}
});
Ответ 3
Если вы добавите данные json в строку запроса и проанализируете его позже в веб-api-стороне. вы также можете анализировать сложный объект. Это полезно, а не пост 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;
}
}
Ответ 4
Также возможно получить доступ к переменным POST через Newtonsoft.Json.Linq JObject.
Например, этот 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"];
}