2015-07-30 4 views
0

Я хочу отправить массив в виде строки JSON в теле запроса с использованием HTTP POST:Отправка массива в POST HTTP

{ 
    { 
     A: 0, 
     B: 1 
    }, 
    { 
     A: 2, 
     B: 3 
    } 
} 

У меня есть следующая структура данных:

public class Test 
    {   
     [Display(Name = "A")] 
     [Range(1, 2147483647)] 
     [Required]   
     public int A { get; set; } 
     [Display(Name = "B")] 
     [Range(0, 2147483647)] 
     [Required] 
     public int B { get; set; } 
    } 

И это мое действие:

 [HttpPost] 
     [ResponseType(typeof(WriteResponse))] 
     [Route("Account/{clientId:int}/Test")] 
     public IHttpActionResult PostEventTest(int clientId, [FromBody]Test[] test){} 

Когда я ударил это действие, тестовый параметр равен нулю. Как я могу получить массив определенного типа через тело запроса?

+0

1) ваш JSON не является массивом 2) Это не является действительным – EZI

ответ

2

Если тест должен представлять весь JSON, то это неправильно. Даже ваш полный JSON ошибочен, потому что это не массив. Правильный JSON будет:

{ 
    "list": [ 
     { 
      "A": "0", 
      "B": "1" 
     }, 
     { 
      "A": "2", 
      "B": "3" 
     } 
    ] 
} 

Или что-то вроде этого:

{ 
    "item1": { 
     A: 0, 
     B: 1 
    }, 
    "Item2": { 
     A: 2, 
     B: 3 
    } 
} 

Для этого вам модель, чтобы изменить. В первом примере ваша модель должна выглядеть следующим образом:

public class TestModel 
{ 
    public IList<Test> list 
    { get; set; } 
} 

public class Test 
{   
     [Display(Name = "A")] 
     [Range(1, 2147483647)] 
     [Required]   
     public int A { get; set; } 
     [Display(Name = "B")] 
     [Range(0, 2147483647)] 
     [Required] 
     public int B { get; set; } 
} 

Для второго примера Test класса был бы таким же, только TestModel изменится:

public class TestModel 
{ 
    public Test item1 
    { get; set; } 

    public Test item2 
    { get; set; } 
} 

Но только первый примером является массивом. Для того, чтобы проверить, правильно ли ваш JSON, используйте jsonlint

EDIT

С моим примером, вам не нужна [FromBody] части, потому что вы можете передать TestModel в качестве параметра вашего метода. Это, на мой взгляд, еще приятнее.

+0

, что если вы не знаете заранее, сколько элементов будет в JSON? –

+1

Чем я использую свой первый пример. В веб-контроллере вы получите экземпляр 'IList ' со всеми моделями в нем. – BendEg

2

То, что вы отправляете, не является массивом. Это должно пойти что-то вроде:

{"test":[ 
    {"A":"0", "B":"0"}, 
    {"A":"0", "B":"1"}, 
    {"A":"1","B":"1"} 
]} 

Подробнее here (w3schools).

Смежные вопросы