Как связать запрос Axios, который содержит массив файлов с моделью ядра ASP.NET, которая содержит список C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как связать запрос Axios, который содержит массив файлов с моделью ядра ASP.NET, которая содержит список

Сообщение Anonymous »

I have started to take advantage of Axios header option multipart/form-data so I can go utilize Typescript objects for my requests to bind to my ASP.NET Core models, however List properties do not seem to bind and stay as null, while my other properties bind fine, including a single IFormFile property.
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
}
Тогда это должно быть привязано к моему AddReviewDto модели в C#:

Код: Выделить всё

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;
}
Это будет преобразовать объект в FormData.

Подробнее здесь: https://stackoverflow.com/questions/796 ... p-net-core
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»