Как следует из названия, у меня есть угловое приложение, которое взаимодействует с сервером .Net, и у меня проблема с httpPost. Прежде чем я скажу дальше, вот код:
компонент:
async addStudent() {
this.studentData = await this.studentService.addStudent(this.newStudentData).toPromise();
}
Оказание услуг:
addStudent(studentNew: Student): Observable<Student[]> {
return this.http.post<Student[]>(this.baseUrl + 'api/Student/addStudents', studentNew, httpOptions)
.pipe(catchError(this.handleErrorNew.bind(this)));
httpОпции:
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json; charset=utf-8'
})
};
Контроллер:
[HttpPost("[action]")]
public IActionResult addStudents([FromBody]Student addStudent)
{
try
{
using (var dbObj= new dataBase())
{
dbObj.Add<Student>(addStudent);
dbObj.SaveChanges();
var students= new List<Student>();
try{
students= dbObj.studentsTable.ToList();
} catch (Exception e) {
Console.WriteLine(e);
}
return Json(students);
}
}
catch (Exception e)
{
Console.WriteLine(e);
return Json(false);
}
}
Модель:
public class Student
{
public int studentId { get; set; }
public int studentNum { get; set; }
public int sectionNum { get; set; }
public string country { get; set; }
public string state { get; set; }
public string city { get; set; }
public long dateJoined { get; set; }
public long dateGraduated { get; set; }
}
Теперь всякий раз, когда API вызывается с использованием POST из angular, для добавления в базу данных переменная addStudent по какой-то причине пуста.
Вызов действия определенно работает, потому что я получаю «ложный» ответ на стороне клиента из части сервера «catch (Exception e)».
System.ArgumentNullException: Value cannot be null.
Это то, что я видел на консоли.
Любые мысли о том, почему сервер не может получить объект? Спасибо!
ОБНОВЛЕНИЕ 1
В моем приложении есть несколько других вызовов POST с другими моделями, и, что удивительно, все они работают нормально, кроме этого.
ОБНОВЛЕНИЕ 2
При дальнейшем копании в бэкенде я обнаружил несколько интересных моментов. Для начала я установил точку останова в начале функции в контроллере и заметил, что вся переменная addStudent буквально имеет значение null, а не отдельные элементы класса в переменной, а переменная в целом. установить на ноль.
В качестве теста я удалил часть [FromBody] следующим образом:
public IActionResult addStudents(Student addStudent)
и теперь, когда я запускаю приложение с точкой останова и просматриваю переменную addStudent, все элементы класса отображаются, но значения всех элементов равны нулю или 0 в зависимости от типа переменной.
@penleychan Я на 100% уверен, что это правильно, потому что я проверил это побуквенно. И я отредактировал вопрос с моделью.
Смущен, [FromBody]Student другой объект, чем Tracking?
Ваш бэкэнд API работает в почтальоне
@penleychan извините, опечатка, я исправил.
@SudarshanaDayananda Да, на удивление, у меня есть несколько других вызовов POST, которые работают с другими моделями. Только этот почему-то не работает.





Выполните отладку, чтобы увидеть, какое значение равно NULL, является ли addStudent равным NULL или одно из свойств равно NULL?
Такое ощущение, что это из-за того, что фреймворк не может создать экземпляр объекта Student на основе тела сообщения.
Посмотрите на стороне клиента, чтобы увидеть, какие именно данные публикуются, и проверьте на стороне сервера, как выглядит addStudent.
к вашему сведению
Это на самом деле помогло немного лучше понять проблему. Я обновил вопрос с результатами отладки. Пожалуйста, посмотрите. Спасибо
Вы проверяли данные, которые отправляете на сервер? Мне кажется, что проблема с данными
Да, я понял это. Это была проблема с данными. Один из типов данных, которые я отправлял, был назначен неправильно. Итак, я получил нулевое значение. Отладка помогла мне разобраться. Спасибо!
Если вы используете .NET Core, вам не хватает этого небольшого атрибута в контроллере API, показанном ниже.

В противном случае я не заинтересован в добавлении этой строки, пожалуйста, напишите свой контроллер, как показано ниже.
[HttpPost]
[Route("PostCustomer")]
public async Task<IActionResult> PostCustomer([FromBody] Customer customer) // Add [FromBody] attribute before parameter.
{
// Do Some Code
return Ok();
}
Если бы вы могли отредактировать свой вопрос и показать нам, какие данные были бы полезны, в противном случае вы на 100% уверены, что они верны? Также предоставьте свою объектную модель Student.