2011-02-10 7 views
1

В POST для контроллера MVC я использую JQuery для отправки объекта JSON с двумя свойствами: Id и Foos. По какой-то причине все свойства каждого экземпляра FooModel все null/empty.asp.net mvc json deserializer не работает

Вот метод:

[HttpPost] 
public ActionResult EditFoo(int Id, FooModel[] foos) 

Это мой скрипача-извлекаться параметры формы (я могу подтвердить, что данные передается на сервер). Я также проверил с двумя отладчиками, что объект JSON содержит все правильные значения.

Id        17934 
Foos[0][Label]     My Foo 
Foos[0][Bars][0][Label]  First Bar 
Foos[0][Bars][0][Id]   1 
Foos[0][Bars][1][Label]  Second Bar 
Foos[0][Bars][1][Id]   2 

FooModel выглядит следующим образом:

public class FooModel 
{ 
    public string Label { get; set; } 
    public IList<Bar> Bars { get; set; } 
} 

В методе EditFoo, можно увидеть массив с правильным числом Foo элементов (в данном примере, 1). Однако все свойства в каждом экземпляре FooModel имеют значение null/empty.

EDIT 1:

Для уточнения: я не создаю параметры формы вручную. Я передаю истинный объект JSON обратно в $ .ajax() через ajaxArgs.data.

Сама форма данных выглядит следующим образом:

Id=17934&Foos%5B0%5D%5BId%5D=1&&Foos%5B0%5D%5BLabel%5D=My+Foo... 

И я не могу найти быстрый способ получить JSON непосредственно в виде строки, но это переменная присваивается ajaxArgs.data (в Фоос все их свойства):

var data = { Id: Model.Id, Foos: Model.Foos }; 

EDIT 2:

Я использую JavaScriptSerializer создать строку, как показано ниже:

public static string ToJson(this object obj) 
    { 
     var serializer = new JavaScriptSerializer(); 
     var foo = serializer.Serialize(obj); 
     return foo; 
    } 

, а затем сделать модель доступна для JavaScript в представлении, как это:

<script type="text/javascript"> 
    var Model = <%= Model.ToJson() %>; 
</script> 

ответ

2

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

Id       17934 
Foos[0].Labe     My Foo 
Foos[0].Bars[0].Label  First Bar 
Foos[0].Bars[0].Id   1 
Foos[0].Bars[1].Label  Second Bar 
Foos[0].Bars[1].Id   2 

или если вы используете ASP.NET MVC 3 JSON провайдера запрос на заводе вы можете отправить запрос JSON как это:

$.ajax({ 
    url: '/foo', 
    type: 'POST', 
    data: JSON.stringify({ 
     Id: 17934, 
     Foos: [ 
      { 
       Bars: [ 
        { Label: 'First Bar', Id: 1 }, 
        { Label: 'Second Bar', Id: 2 } 
       ] 
      } 
     ] 
    }), 
    contentType: 'application/json', 
    success: function(result) { 
     alert('success');  
    } 
}); 

, который необходимо отправить следующее запрос:

{ Id: 17934, Foos: [ { Bars: [ { Label: 'First Bar', Id: 1 }, { Label: 'Second Bar', Id: 2 } ] } ] } 
+0

Я обновил сообщение, чтобы уточнить ... Я сам не создаю параметры формы. Опять же, это именно то, как их показывает Fiddler. –

+1

@c_bit, тот факт, что Fiddler отображает такие параметры, как это означает, что они отправляются таким образом, и, как я объяснил в своем ответе, связующее устройство по умолчанию не может понять такой синтаксис, который объясняет, почему вы получаете нули. Я показал правильный синтаксис, который вам нужен, если вы хотите использовать параметры строки запроса. 'var data = {Id: Model.Id, Foos: Model.Foos};' просто не собирается работать со сложными наборами параметров. Вы можете попробовать отправить запрос JSON, как показано в моем ответе. Для этого, конечно, вам нужен JSON valueprovider. MVC 3 из коробки. –

+0

И вот [сообщение в блоге] (http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx), который иллюстрирует, как для отправки запросов JSON в предыдущих версиях MVC 3. –

0

Вы используете скобки неправильно. Это:

Foos[0][Bars][0][Label] 

Должно выглядеть так:

Foos[0].Bars[0].Label 

Кроме того, это не JSON, они параметры формы POST.

+0

Именно так Fiddler представляет собой параметры формы.Я получу образец JSON –

+0

@c_bit, да, я уверен, что именно так Fiddler представляет их, но это также потому, что именно так они отправляются. jQuery позволяет отправлять данные через AJAX с использованием различных механизмов, включая как формы POST *, так и JSON. Вы явно используете вариант формы POST, а ** имя ** часть пар имя/значение неверно отформатированы для связующего объекта модели ASP.NET MVC. –

+0

Не уверен, что я понимаю, метод POST. Данные являются объектами JSON. –