В 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>
Я обновил сообщение, чтобы уточнить ... Я сам не создаю параметры формы. Опять же, это именно то, как их показывает Fiddler. –
@c_bit, тот факт, что Fiddler отображает такие параметры, как это означает, что они отправляются таким образом, и, как я объяснил в своем ответе, связующее устройство по умолчанию не может понять такой синтаксис, который объясняет, почему вы получаете нули. Я показал правильный синтаксис, который вам нужен, если вы хотите использовать параметры строки запроса. 'var data = {Id: Model.Id, Foos: Model.Foos};' просто не собирается работать со сложными наборами параметров. Вы можете попробовать отправить запрос JSON, как показано в моем ответе. Для этого, конечно, вам нужен JSON valueprovider. MVC 3 из коробки. –
И вот [сообщение в блоге] (http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx), который иллюстрирует, как для отправки запросов JSON в предыдущих версиях MVC 3. –