ApiController 매개 변수에서 복합 유형이 null을 가져오는 중입니다.
파라미터 "Parametro Filtro Filtro"가 null이 되고 다른 파라미터 "page" 및 "page Size"가 정상으로 표시되는 이유를 알 수 없습니다.
public class ParametroFiltro
{
public string Codigo { get; set; }
public string Descricao { get; set; }
}
My 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으로 포맷합니다).
를 제공하다contentType속성을 지정합니다.게시할 JSON 데이터를 빌드하려면 메서드를 사용합니다.활자를 바꾸다POST및 MVC Model 바인딩은 게시된 데이터를 클래스 개체에 바인딩합니다.
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);
}
});
Newtonsoft를 통해 POST 변수에 액세스할 수도 있습니다.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"];
}
쿼리 문자열에 json 데이터를 추가하고 나중에 웹 API 측에서 구문 분석하는 경우.복잡한 오브젝트를 해석할 수도 있습니다.특별한 httpget 요건의 경우 특히 post 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;
}
}
.NET Core에서는HttpClient를 설정합니다.transfer-encoding: chunked디폴트로는 header 입니다.이로 인해가 발생할 수 있습니다.NET Web API 컨트롤러 매개 변수가 null입니다.
이 문제를 해결하려면 , 다음의 순서를 설정할 필요가 있습니다.ContentLength헤더를 명시적으로 지정합니다.
var json = JsonConvert.SerializeObject(myObject);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentLength = json.Length;
var response = await client.PostAsync("http://my-api.com", content);
이미 알고 있다면 대답하세요.transfer-encoding헤더가 문제입니다.ASP에서 청크 전송 부호화를 디세블로 하는 방법.HttpClient를 사용한 Net C#
수정되지 않는 관련 버그: https://github.com/dotnet/runtime/issues/30283
언급URL : https://stackoverflow.com/questions/12916340/complex-type-is-getting-null-in-a-apicontroller-parameter
'programing' 카테고리의 다른 글
| 파일 업로드:완료된 진행률 표시줄 (0) | 2023.03.14 |
|---|---|
| reactjs의 컨텍스트 API를 통해 상태를 관리하려면 useMemo가 필요합니까? (0) | 2023.03.14 |
| Python - JSON 파일을 데이터 프레임으로 변환하는 방법 (0) | 2023.03.14 |
| 대응: 외부 html 파일을 로드 및 렌더링하는 방법 (0) | 2023.03.09 |
| 스프링 부트 @Value 속성 (0) | 2023.03.09 |