Webapi получает JSON в скобках - PullRequest
1 голос
/ 17 марта 2019

Я просто хочу понять, я трачу дни, пытаясь решить проблему, из-за которой не работала операция POST (с использованием Web Api и Angular JS).Я думал обо всем, пытался, искал, я даже тысячу раз менял код.После этого я обнаружил, что POST работает, когда формат JSON был примерно таким:

{"Name":"Test","Age":23}

, но если я использовал JSON.stringify(options.models);

операция POST не работала, ее форматбыло так:

[{"Name":"Test","Age":23}]

Я не понимаю, в чем разница между ними (независимо от скобок [])

Почему первый работал, а второй - нет?

Есть ли способ заставить работать второй формат?

Является ли второй массив массивом JSON?

Разве JSON.stringify(options.models) не должен возвращать формат JSON?

Класс:

 public class EmployeesData
        {
            public EmployeesData() { }
            public EmployeesData(int Id, string Name, int Age, int Phone,string Job, string Department)
            {   this.ID = Id;
                this.Name = Name;
                this.Age = Age;
                this.Phone = Phone;
                this.Job = Job;
                this.Department = Department;}

            [Required]
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }

        }

В WebApi:

    [HttpPost]
        [ResponseType(typeof(EmployeesData))]

        public async Task<IHttpActionResult> Post([FromBody]EmployeesData employeesData) 
{
            if (!ModelState.IsValid) {
              return BadRequest(ModelState);}

            db.Employees.Add(employeesData);
            await db.SaveChangesAsync();

            return CreatedAtRoute("DefaultApi", new { id = employeesData.ID }, employeesData);
        }

В Angularjs:

parameterMap: function(options, operation) {
        if (operation !== "read") {
             console.log(kendo.stringify(options));
              console.log(JSON.stringify(options.models)); // Not work because of []
             var R = JSON.stringify(options.models).replace(/]|[[]/g, ''); // work I removed []
                                console.log(operation + R);

                             return (R);
                            }


                        }
                    }

1 Ответ

2 голосов
/ 17 марта 2019

Оба упомянутых формата ({"Name":"Test","Age":23} и [{"Name":"Test","Age":23}]) означают два разных контракта.

Первый - просто объект, а второй - набор объектов.

Предположим, что выотправив {"Name":"Test","Age":23} из angular, тогда ваш метод контроллера Api должен быть похож на

public void Demo(Test test)
{
  ///code here 
}

, где Test будет

public class Test 
{
   public string Name {get;set;}
   public int Age {get;set;}
}

и если вы отправляете [{"Name": "Test"," Age ": 23}] тогда ваш контроллер должен выглядеть как

public void Demo(ICollection<Test> test)
{
  ///code here 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...