Почему значение obj равно null в контроллере asp web API2, если в угловом http.post указано правильное значение - PullRequest
1 голос
/ 20 мая 2019

Я работаю над небольшим проектом по изучению Angular7 с ASP WebAPI2. Когда я публикую сообщения с использованием http.post (), контроллер веб-API ASP не получает никакого значения, а для obj устанавливается значение null.

Я пытался реализовать аналогичные коды в других частях приложения и работает нормально.

Мой WebAPI выглядит так -

        [Route("api/rota/InsertRota")]
        [HttpPost]
        public HttpResponseMessage InsertRota(Models.HelpdeskStaffRota paraStaffRota)
        {
            try
            {
                string conString = ConfigurationManager.ConnectionStrings["HelpdeskStaffRota"].ConnectionString;
                using (SqlConnection conn = new SqlConnection(conString))
                using (SqlCommand comm = new SqlCommand("RotaInsert", conn))
                {
                    conn.Open();
                    comm.CommandType = System.Data.CommandType.StoredProcedure;

                    comm.Parameters.Add(new SqlParameter("@RotaDate", paraStaffRota.RotaDate));
                    comm.Parameters.Add(new SqlParameter("@RotaMorning", paraStaffRota.RotaMorning));
                    comm.Parameters.Add(new SqlParameter("@RotaLunch", paraStaffRota.RotaLunch));
                    comm.Parameters.Add(new SqlParameter("@RotaLate", paraStaffRota.RotaLate));
                    comm.ExecuteNonQuery();
                    conn.Close();
                }
                List<Models.HelpdeskStaffRota> items = GetItems();
                return Request.CreateResponse(HttpStatusCode.OK, items);
            }
            catch (System.Exception e)
            { return Request.CreateResponse(HttpStatusCode.SeeOther, e.Message); }
        }

и модель asp -

    public class HelpdeskStaffRota
    {
        public Int64 Id { get; set; }

        [Required(ErrorMessage = "Please select a date")]
        public DateTime RotaDate { get; set; }

        [Required(ErrorMessage = "Please select a Staff for Morning")]
        public string RotaMorning { get; set; }

        [Required(ErrorMessage = "Please select a Staff for Lunch")]
        public string RotaLunch { get; set; }

        [Required(ErrorMessage = "Please select a Staff for Late")]
        public string RotaLate { get; set; }

        public string RotaDateString {
            get
            {
                return this.RotaDate.ToString("dd/MM/yyyy");
            }
            set
            {
                this.RotaDate = DateTime.ParseExact(value, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            }


        }


    }

А Угловой сервис -

  addRota(rota: Rota) {
    const addRotaURL = `${this.baseURL}api/rota/InsertRota`;
    return this.http.post(addRotaURL, rota);
  }

и англуар рота класса -

export class Rota {
    Id: number;
    RotaDate: Date;
    RotaMorning: string;
    RotaLunch: string;
    RotaLate: string;
}

Если я перехожу в режим отладки, я вижу, что в угловом коде действительно установлено значение объекта, и я вижу, что он достигает точек останова внутри контроллера, однако значение для paraStaffRota равно нулю. Я ожидаю, что paraStaffRota (контроллер веб-API) = Rota (отправлено из углового).

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

@ sharmav1 очень правильно предложили попробовать использовать String вместо Date, однако я сталкивался с другими проблемами с типом Date in angular.

Я нашел обходной путь, так как манипулирование типом Date в angular не прошло очень хорошо. Это не очень хорошее решение, и, возможно, стоит заняться этим с большим количеством времени. Я создал функцию, которая принимает тип даты obj и возвращает дату в виде строки, то есть в формате ГГГГ-ММ-ДД.

getDateInString(dateObj: Date): string {
    const str: string[] = JSON.stringify(dateObj).replace('{', '').replace('}', '').split(',');
    return str[0].substring(7) + '-' + str[1].substring(8) + '-' + str[2].substring(6);
}

Передача значения String в RotaDate в мой ASP API, похоже, преобразует String в правильный тип C # DateTime и теперь работает нормально.

Если я найду лучшее решение, я опубликую его здесь.

0 голосов
/ 20 мая 2019

Вы можете добавить [FromBody] к вашему параметру

public HttpResponseMessage InsertRota([FromBody] Models.HelpdeskStaffRota paraStaffRota)
{
 // code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...