Привязка модели Json MVC3 не работает при отправке на сервер - PullRequest
5 голосов
/ 06 декабря 2011

У меня странная проблема с MVC3 и привязкой модели.Когда я публикую объект JSON в моем контроллере, механизм связывания не может вообще создать типизированный объект.Все свойства по умолчанию (т.е. пустые строки)

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

IЯ пробовал с

$.ajaxSettings.traditional = true;

, и это не имеет никакого значения

Например, если я публикую

{"RoutineName":"My new routine","Routines":[{"DayName":"Monday","Items":[21,31]}]}

Связыватель модели не работает, но приходит с сервераданные выглядят как

{"RoutineName":"Routine From Code","Routines":[{"DayName":"Monday","Items":[1,2]},{"DayName":"Tuesday","Items":[]}]}

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

$('#submitRoutine').click(function () {
            var routines = [];
            $('.DayName').each(function (index, item) {
                var $item = $(item);
                var name = $item.html();
                var routineItems = [];
                $($item.attr('href')).find('.itemId').each(function () {
                    routineItems.push(parseInt($(this).val(), 10));
                });
                routines.push({
                    DayName: name,
                    Items: routineItems
                });
            });
            var routine = {
                RoutineName: $('#routineName').val(),
                Routines: routines
            };

            $.ajaxSettings.traditional = true;
            $.post('/Machine/CreateRoutine', JSON.stringify(routine),function (data) {},'json');
        });

Таким образом, похоже, что привязка модели из типизированного объекта к JSON в порядке, но возвращаемся в другую сторонунет.Есть что-то, что я пропустил?

Модели в F #

type RoutineDayViewModel() =
    let mutable _name = String.Empty
    let mutable _items = new ResizeArray<int>()

    member x.DayName with get() = _name and set value = _name <- value
    member x.Items with get() = _items and set value = _items <- value

type RoutineViewModel() =
    let mutable _name = String.Empty
    let mutable _routines = new ResizeArray<RoutineDayViewModel>()

    member x.RoutineName with get() = _name and set value = _name <- value
    member x.Routines with get() = _routines and set value = _routines <- value

РЕДАКТИРОВАТЬ: я также пробовал с помощью следующих классов C # и получить тот же результат

 public class RoutineDayViewModel
    {
        public string DayName { get; set; }
        public List<int> Items{ get; set; }
    }

    public class RoutineViewModel
    {
        public string RoutineName { get; set; }
        public List<RoutineDayViewModel> Routines { get; set; }
    }

Я также добавил следующее в global.asax

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())

Спасибо

Ответы [ 2 ]

8 голосов
/ 07 декабря 2011

Вам необходимо установить тип содержимого запроса на application/json, если вы собираетесь отправлять запрос в формате JSON, что вы и делаете с методом JSON.stringify. Так что вместо:

$.post('/Machine/CreateRoutine', JSON.stringify(routine),function (data) {},'json');

вы можете использовать:

$.ajax({
    url: '/Machine/CreateRoutine',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(routine),
    success: function (data) {

    } 
});

При этом вам не нужно устанавливать $.ajaxSettings.traditional, и при этом вы не должны добавлять JsonValueProviderFactory в ваш Global.asax, так как этот провайдер уже добавлен по умолчанию в ASP.NET MVC 3.

2 голосов
/ 07 декабря 2011

Я решил это, используя Jickascript код Ника Риггса Postify

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...