我正在嘗試將復雜的資料串列傳遞給 .net core web api 控制器,但值沒有系結,下面是我正在使用的代碼。
public IActionResult Add([FromForm]List<SponsorViewModel> sponsorDetailsList,
IFormFile profilePic)
有人可以幫忙嗎?我已經檢查了其他堆疊溢位問題,但它沒有解決問題。
uj5u.com熱心網友回復:
我發現不正確支持發送帶有檔案的多個復雜物件,您需要在 .NetCore 6 中以不同方式處理兩者。
您如何從客戶端發送資料?
如果使用AJAX,您需要發送一個FormData并禁用處理資料及其內容型別。
let myObject = {...}; // your object
let array_of_files = [...]; // your files as an array
let formData = new FormData();
// set the object as the first element to be sent
formData.append("sponsorDetailsList", JSON.stringify(myObject));
// set the files as to send them after the object
$.each(array_of_files , function(i, file) {
formData.append("profilePic", file);
});
$.ajax({
type: "post",
url: "?handler=Add",
dataType: "json",
data: formData,
processData: false,
contentType: false,
headers: { "RequestVerificationToken": $("input[name=\"__RequestVerificationToken\"]").val() },
success: function(response) {
},
error: function(xhr, ajaxOptions, thrownError) {
}
});
在您的控制器中(假設您使用的是 Razor 頁面,如果沒有,請調整它)
public IActionResult OnPostAdd([FromForm] List<IFormFile> profilePic) {
// need to deserialize sponsorDetailsList separately
try {
List<SponsorViewModel> sponsorDetailsList = Enumerable.Empty<SponsorViewModel>().ToList();
foreach (var data in HttpContext.Request.Form.Keys.Select((val, i) => new { key = val, intIndex = i })) {
if (data.intIndex == 0) // first element sent is the object
sponsorDetailsList = JsonConvert.DeserializeObject<IEnumerable<SponsorViewModel>>(!string.IsNullOrWhiteSpace(HttpContext.Request.Form[data.key]) ? HttpContext.Request.Form[data.key] : new Microsoft.Extensions.Primitives.StringValues());
}
}
catch (Exception ex) {
// error occured while deserializing
}
}
uj5u.com熱心網友回復:
我假設由于檔案附加在正文中,因此在表單提交期間是多部分表單資料。所以嘗試使用 [FromBody] 而不是 [FromForm]
uj5u.com熱心網友回復:
表單鍵/值對看起來像這樣
Key: sponsorDetailsList[0][Id]
Value: 1
Key: sponsorDetailsList[0][Name]
Value: John
例如 cURL 格式
curl --location --request POST 'https://localhost:7149/api' \
--form 'sponsorDetailsList[0][Id]="1"' \
--form 'sponsorDetailsList[0][Name]="John"'
在 Postman 中測驗。與 List 和 File 一起使用效果很好。
更新
這是最低限度的作業代碼
形式
<form action="/api" method="post" enctype="multipart/form-data">
<input type="number" name="sponsorDetailsList[0][Id]" />
<input type="text" name="sponsorDetailsList[0][Name]" />
<input type="file" name="profilePic" />
<input type="submit" value="Submit">
</form>
控制器方法
[HttpPost]
public IActionResult Add([FromForm] List<SponsorViewModel> sponsorDetailsList, IFormFile profilePic)
{
return Ok();
}
我想你可以想象一個更復雜的場景,即使是 JS 等等。
uj5u.com熱心網友回復:
什么是 POST 請求,資料會出現在請求正文中。試試 [FromBody]
[HttpPost]
public IActionResult Add([FromBody]List<SponsorViewModel> sponsorDetailsList, IFormFile profilePic)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518520.html
