My Typescript interface is as следует: < /p>
Код: Выделить всё
export interface AddReview {
primaryDoc: File; // Required, PDF
supportingDocuments: File[] | null;
stateId: number; // Required
}
< /code>
и мой запрос Axios: < /p>
const addReview = async (submissionData : SDP.AddReview) : Promise => {
const data = api.post(`/sdp/Review/`, submissionData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
.then(response => {
const apiResponse : API.Response = response.data
const review : any = apiResponse.data
return review
}).catch(error => {
if(error.response.status == 400) {
router.push({ name: 'Error'})
}
return null
})
return data
}
Код: Выделить всё
public class AddReviewDTO
{
[Required]
public required IFormFile PrimaryDoc { get; set; }
public List? SupportingDocuments { get; set; }
[Required]
public required int StateId { get; set; }
}
< /code>
Действие контроллера, которое пытается достичь этого действия, заключается в следующем: < /p>
public async Task AddReviewAsync([FromForm] AddReviewDTO addDTO)
{
string json = JsonSerializer.Serialize(addReviewDTO);
}
< /code>
Я знаю, что есть случаи, когда в ядре ASP.NET требуются пользовательские модельные связующие, но это кажется настолько простым, поэтому я надеюсь, что это можно сделать без такого рода решения, так как я хочу повторно использовать этот подход во многих сценариях с разными моделями. Кроме того, я не хочу возвращаться к приближению к зацикции через весь мой объект, чтобы добавить к FormData
Вот аналогичный вопрос, но нет ответа, не переключаясь на полную форму Formdata , который я использую для использования и хочу уйти от:
. /> Мое единственное решение до сих пор - эта функция утилиты, которую я имел CHATGPT CREATE: < /p>
Код: Выделить всё
const objectToFormData = (
obj: Record,
form: FormData = new FormData(),
namespace: string = ''
): FormData => {
Object.keys(obj).forEach((key) => {
const value = obj[key];
if (value === undefined || value === null) return;
const formKey = namespace ? `${namespace}.${key}` : key;
if (value instanceof Date) {
form.append(formKey, value.toISOString());
} else if (value instanceof File || value instanceof Blob) {
form.append(formKey, value, value.name);
} else if (Array.isArray(value)) {
value.forEach((element) => {
if (element instanceof File || element instanceof Blob) {
// ✅ Multiple files should use the same key (no index)
form.append(formKey, element, element.name);
} else if (typeof element === 'object' && element !== null) {
// Use dot notation or any custom naming here
objectToFormData(element, form, formKey);
} else {
form.append(formKey, String(element));
}
});
} else if (typeof value === 'object') {
objectToFormData(value, form, formKey);
} else {
form.append(formKey, String(value));
}
});
return form;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... p-net-core