Основное приложение Angular и .Net httpPost отправляет нулевой объект

Как следует из названия, у меня есть угловое приложение, которое взаимодействует с сервером .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 в зависимости от типа переменной.

Если бы вы могли отредактировать свой вопрос и показать нам, какие данные были бы полезны, в противном случае вы на 100% уверены, что они верны? Также предоставьте свою объектную модель Student.

penleychan 28.06.2019 03:31

@penleychan Я на 100% уверен, что это правильно, потому что я проверил это побуквенно. И я отредактировал вопрос с моделью.

Arcenal 28.06.2019 03:36

Смущен, [FromBody]Student другой объект, чем Tracking?

penleychan 28.06.2019 03:56

Ваш бэкэнд API работает в почтальоне

Sudarshana Dayananda 28.06.2019 04:12

@penleychan извините, опечатка, я исправил.

Arcenal 28.06.2019 20:26

@SudarshanaDayananda Да, на удивление, у меня есть несколько других вызовов POST, которые работают с другими моделями. Только этот почему-то не работает.

Arcenal 28.06.2019 20:27
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
6
586
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Выполните отладку, чтобы увидеть, какое значение равно NULL, является ли addStudent равным NULL или одно из свойств равно NULL?

Такое ощущение, что это из-за того, что фреймворк не может создать экземпляр объекта Student на основе тела сообщения.

Посмотрите на стороне клиента, чтобы увидеть, какие именно данные публикуются, и проверьте на стороне сервера, как выглядит addStudent.

к вашему сведению

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.2#input-formatters

Это на самом деле помогло немного лучше понять проблему. Я обновил вопрос с результатами отладки. Пожалуйста, посмотрите. Спасибо

Arcenal 28.06.2019 20:29

Вы проверяли данные, которые отправляете на сервер? Мне кажется, что проблема с данными

Owenc 30.06.2019 03:11

Да, я понял это. Это была проблема с данными. Один из типов данных, которые я отправлял, был назначен неправильно. Итак, я получил нулевое значение. Отладка помогла мне разобраться. Спасибо!

Arcenal 12.07.2019 01:26

Если вы используете .NET Core, вам не хватает этого небольшого атрибута в контроллере API, показанном ниже.

В противном случае я не заинтересован в добавлении этой строки, пожалуйста, напишите свой контроллер, как показано ниже.

    [HttpPost]
    [Route("PostCustomer")]
    public async Task<IActionResult> PostCustomer([FromBody] Customer customer) // Add [FromBody] attribute before parameter.
    {
        // Do Some Code
        return Ok();
    }

Другие вопросы по теме