JavaScript передает ноль в поле ExpandoObject в параметре C # Controller - PullRequest
0 голосов
/ 14 ноября 2018

Мой код JavaScript

$('[step="4"]').click(function () {
//shortened for brevety
var _model = new Object();
_model.ItemDesc.value = 'Descript';
//^ throws an error but gets fixed if removing the .value
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'

    $.ajax({
        type: "POST",
        url: 'CreateItemCallAsync',
        data: _model,
        success: function (msg) {
            status = JSON.stringify(msg);
            alert('Item created successfully!');
            location.reload();
        },
        error: function (msg) {
            status = JSON.stringify(msg);
            alert('Failed to create item.');
            location.reload();
        }
    });
});

Код контроллера C #

[HttpPost]
public async Task<JsonResult> CreateItemCallAsync(CreateItemModel item)
{
   //breakpoint here 
   var test = item.ItemDesc;
   var qty = item.ItemQty.num; //getting nulls here
   var unit = item.ItemQty.unit; //getting nulls here
}

C # CreateItemModel

public class CreateItemModel
{
   public string ItemName { get; set; }
   public string ItemDesc { get; set; }
   public ExpandoObject ItemQty { get; set; }
}

Объект JavaScript

[
  {
     ItemName : 'Item1',
     ItemDesc : 'Descript'
     ItemQty : { num : 5 , unit: 'pcs'}
  },
  {
     ItemName : 'Item2',
     ItemDesc : 'Descript'
     ItemQty : { num : 1 , unit: 'box'}
  }
]

Откод выше.У меня есть объект JavaScript, переданный моему контроллеру C # с параметром CreateItemModel, который имеет поле ItemQty как ExpandoObject.Однако после перехода на мой C # контроллер.ItemQty.num и ItemQty.unit являются null.

При дальнейшем исследовании, перед передачей объекта JavaScript в контроллер C #.Объекты успешно заполнены.

Мне нужно ItemQty как ExpandoObject, потому что поля / свойства в ItemQty всегда меняются / динамические

Вопросы:

  1. (немного не по теме), почему _model.ItemDesc.value = 'Descript' ошибки?С другой стороны, _model.ItemDesc = 'Descript' работает без ошибок.
  2. Почему я получаю значения NULL в ItemQty свойствах?

1 Ответ

0 голосов
/ 14 ноября 2018

(немного не по теме), почему _model.ItemDesc.value = 'Descript' ошибки?С другой стороны, _model.ItemDesc = 'Descript' работает без ошибок.

Поскольку в исходном javascript Object.

* 1012 отсутствует свойство ItemDesc, ItemQty, ItemQty.* Вы можете попытаться создать анонимный объект JSON для вашего кода javascript.
var _model = {     
    ItemDesc: {
        value : "Descript"
    }, 
    ItemQty :{
        num : 1,
        unit :'pcs'
    }
};

вместо

var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'

ваша модель c # может выглядеть так, потому что ваш текущий ItemDesc объектвместо строкового значения.

Почему я получаю nulls в ItemQty свойствах?

Поскольку ModelBindiner по умолчанию не может найти ExpandoObject с вашим JSON ключ ItemQty объект.

public class ItemDesc
{
    public string value { get; set; }
}

public class ItemQty
{
    public int num { get; set; }
    public string unit { get; set; }
}

public class CreateItemModel
{
    public ItemDesc ItemDescContext { get; set; }
    public ItemQty ItemQtyContext { get; set; }
}
...