MVC 3 JSON Модель привязки не создает объект - PullRequest
2 голосов
/ 31 января 2012

Это была моя первая попытка связывания модели JSON MVC, и все идет не по плану ... огромный вздох!При каждой попытке, когда я нарушаю действие контроллера, строго типизированная модель / класс либо пуста, либо равна нулю.

Что я делаю:

На стороне клиента я создаю массив для хранения платежей

var PAYMENTS = new Array();

Значения платежа вводятся пользователем и добавляются в массив платежей.Некоторые поля будут заполнены на стороне сервера только после публикации данных, поэтому я присваиваю временные значения. (Ссылка, ID пользователя)

PAYMENTS.push({ reference: "0",
            paymentDate: date,
            paymentMethodID: paymentMethod,
            paymentAmount: amount,
            bankNameID: bankID,
            bankBranchCode: branch,
            drawerName: drawer,
            chequeNo: chequeNo,
            userID: "00000000-0000-0000-0000-000000000000",
            statementNo: statementNo,
            additionalReference: additionalRef
        });

После добавления 2-х платежей это результат firebug для PAYMENTS

0 Object { reference="0", paymentDate="31-01-2012", paymentMethodID="7", more...}
1 Object { reference="0", paymentDate="31-01-2012", paymentMethodID="0", more...}

Пользователь выбирает для обработки платежей, который вызывает processPayment ()

Практики - это второй параметр, который необходимо передать, но он просто пытается заставить платеж работать первым.

function processPayment() {

    var paymentsJSON = $.toJSON(PAYMENTS);
//  var practicesJSON = $.toJSON(selectedPractices);

    $.ajax({
        url: BASE_APP_URL + "Payment/processPayment",
        type: 'POST',
        data: "{ param : '" + paymentsJSON + "'}" ,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            alert(data);
        }
    });
}

Класс ViewModel.Я упростил типы viewModel, пытаясь получить что-то в контроллер.

public class paymentsViewModelJSONPayment
{
    public string referece { get; set; }
    public string paymentDate { get; set; }
    public string paymentMethodID { get; set; }
    public decimal paymentAmount { get; set; }
    public string bankNameID { get; set; }
    public string bankBranchCode { get; set; }
    public string drawerName { get; set; }
    public string chequeNo { get; set; }
    public string userID { get; set; }
    public string statementNo { get; set; }
    public string additionalReference { get; set; }
}

наконец, действие контроллера

[HttpPost]
public ActionResult processPayment(List<paymentsViewModelJSONPayment> param)
{
    return Json(param);

При отладке:

Отправка значений изFirebug:

JSON


param   "[{"reference":"0","paymentDate":"31-01-2012","paymentMethodID":"7","paymentAmount":500,"bankNameID":"8","bankBranchCode":"","drawerName":"","chequeNo":"","userID":"00000000-0000-0000-0000-000000000000","statementNo":"","additionalReference":""},{"reference":"0","paymentDate":"31-01-2012","paymentMethodID":"0","paymentAmount":500,"bankNameID":"10","bankBranchCode":"0026","drawerName":"drawer","chequeNo":"00231021","userID":"00000000-0000-0000-0000-000000000000","statementNo":"","additionalReference":""}]"

Точка останова в контроллере.Действие вызывается, но без привязки.

Запрещено публиковать изображения, но при разрыве контроллера Список пуст.

Из списка наблюдения:

  • param Count = 0 System.Collections.Generic.List
  • Raw View Capacity 0 int Count 0 int
  • Статические члены
  • Непубличные члены

У меня почти нет идей, я пробовал разные конфигурации и немного потерял счет из-за того, что я пробовал.

Буду очень признателен за любую помощь.

Спасибо за стек.

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Попробуйте указать 500.0 для paymentAmount. Мне нравится использовать Fiddler2 для проверки таких вещей: http://www.fiddler2.com/fiddler2/.

Эта ссылка проливает свет на десятичные значения привязки: http://digitalbush.com/2011/04/24/asp-net-mvc3-json-decimal-binding-woes/

РЕДАКТИРОВАТЬ : я создал тестовый проект, используя ваши классы, и смог без проблем поместить POST ваш JSON (но настроив paymentAmount), используя Fiddler, в контроллер.

Запрос отображается на верхней панели, а ответ (отформатированный в формате JSON Fiddler) - внизу.

Свойство referece в вашем классе - ошибка, поэтому возвращается как null.

Fiddler Screen Grab

0 голосов
/ 01 февраля 2012

Единственный способ, которым я мог получить значение, привязанное к 'param', было определить его как строку.Затем я использовал JavascriptSerializer для десериализации его в желаемый объект.

[HttpPost]
public JsonResult processPayment(string param)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    try
    {
        List<paymentsViewModelJSONPayment> payments = serializer.Deserialize<List<paymentsViewModelJSONPayment>>(param);

значение параметра в точке останова

"[{\"reference\":\"0\",\"paymentDate\":\"01-02-2012\",\"paymentMethodID\":\"7\",\"paymentAmount\":500,\"bankNameID\":\"8\",\"bankBranchCode\":\"\",\"drawerName\":\"\",\"chequeNo\":\"\",\"userID\":\"00000000-0000-0000-0000-000000000000\",\"statementNo\":\"\",\"additionalReference\":\"\"}]"

значение платежа в VS watchlsit

    payments    Count = 1
System.Collections.Generic.List<PCNS.viewModels.paymentsViewModelJSONPayment>
    [0] {PCNS.viewModels.paymentsViewModelJSONPayment}  PCNS.viewModels.paymentsViewModelJSONPayment
    additionalReference ""  string
    bankBranchCode  ""  string
    bankNameID  "8" string
    chequeNo    ""  string
    drawerName  ""  string
    paymentAmount   500 decimal
    paymentDate "01-02-2012"    string
    paymentMethodID "7" string
    referece    null    string
    statementNo ""  string
    userID  "00000000-0000-0000-0000-000000000000"  string

Кажетсякак хак, но это работает.

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