Javascript passing null to an ExpandoObject field in C# Controller parameter
up vote
1
down vote
favorite
My Javascript Code
$('[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# Controller Code
[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 Object
[
{
ItemName : 'Item1',
ItemDesc : 'Descript'
ItemQty : { num : 5 , unit: 'pcs'}
},
{
ItemName : 'Item2',
ItemDesc : 'Descript'
ItemQty : { num : 1 , unit: 'box'}
}
]
From the code above. I have a JavaScript object passed to my C# controller with a CreateItemModel parameter that has a field of ItemQty as an ExpandoObject. However, after passing to my C# controller. the ItemQty.num and ItemQty.unit are null.
With further investigating, before passing the JavaScript object to C# controller. the Objects are successfully populated.
I need ItemQty as an ExpandoObject because the fields/properites under ItemQty is always changing/dynamic
Questions:
- (Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error. - Why am I getting nulls in
ItemQtyproperties?
javascript c# asp.net-mvc json.net expando
|
show 4 more comments
up vote
1
down vote
favorite
My Javascript Code
$('[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# Controller Code
[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 Object
[
{
ItemName : 'Item1',
ItemDesc : 'Descript'
ItemQty : { num : 5 , unit: 'pcs'}
},
{
ItemName : 'Item2',
ItemDesc : 'Descript'
ItemQty : { num : 1 , unit: 'box'}
}
]
From the code above. I have a JavaScript object passed to my C# controller with a CreateItemModel parameter that has a field of ItemQty as an ExpandoObject. However, after passing to my C# controller. the ItemQty.num and ItemQty.unit are null.
With further investigating, before passing the JavaScript object to C# controller. the Objects are successfully populated.
I need ItemQty as an ExpandoObject because the fields/properites under ItemQty is always changing/dynamic
Questions:
- (Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error. - Why am I getting nulls in
ItemQtyproperties?
javascript c# asp.net-mvc json.net expando
Could you show use your receiveJSONdata?
– D-Shih
Nov 14 at 7:55
Add yourCreateItemModelto the question
– user3559349
Nov 14 at 7:56
1
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
For point 1 -ItemDescis typeofstring- it does not have a property namedvalue
– user3559349
Nov 14 at 8:06
1
You need to modify the data you are sending if you want to use a Dictionary (using the defaultcontentTypeas you are doing, then it would bevar _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };
– user3559349
Nov 14 at 8:26
|
show 4 more comments
up vote
1
down vote
favorite
up vote
1
down vote
favorite
My Javascript Code
$('[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# Controller Code
[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 Object
[
{
ItemName : 'Item1',
ItemDesc : 'Descript'
ItemQty : { num : 5 , unit: 'pcs'}
},
{
ItemName : 'Item2',
ItemDesc : 'Descript'
ItemQty : { num : 1 , unit: 'box'}
}
]
From the code above. I have a JavaScript object passed to my C# controller with a CreateItemModel parameter that has a field of ItemQty as an ExpandoObject. However, after passing to my C# controller. the ItemQty.num and ItemQty.unit are null.
With further investigating, before passing the JavaScript object to C# controller. the Objects are successfully populated.
I need ItemQty as an ExpandoObject because the fields/properites under ItemQty is always changing/dynamic
Questions:
- (Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error. - Why am I getting nulls in
ItemQtyproperties?
javascript c# asp.net-mvc json.net expando
My Javascript Code
$('[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# Controller Code
[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 Object
[
{
ItemName : 'Item1',
ItemDesc : 'Descript'
ItemQty : { num : 5 , unit: 'pcs'}
},
{
ItemName : 'Item2',
ItemDesc : 'Descript'
ItemQty : { num : 1 , unit: 'box'}
}
]
From the code above. I have a JavaScript object passed to my C# controller with a CreateItemModel parameter that has a field of ItemQty as an ExpandoObject. However, after passing to my C# controller. the ItemQty.num and ItemQty.unit are null.
With further investigating, before passing the JavaScript object to C# controller. the Objects are successfully populated.
I need ItemQty as an ExpandoObject because the fields/properites under ItemQty is always changing/dynamic
Questions:
- (Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error. - Why am I getting nulls in
ItemQtyproperties?
javascript c# asp.net-mvc json.net expando
javascript c# asp.net-mvc json.net expando
edited Nov 14 at 8:03
asked Nov 14 at 7:53
Hexxed
485317
485317
Could you show use your receiveJSONdata?
– D-Shih
Nov 14 at 7:55
Add yourCreateItemModelto the question
– user3559349
Nov 14 at 7:56
1
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
For point 1 -ItemDescis typeofstring- it does not have a property namedvalue
– user3559349
Nov 14 at 8:06
1
You need to modify the data you are sending if you want to use a Dictionary (using the defaultcontentTypeas you are doing, then it would bevar _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };
– user3559349
Nov 14 at 8:26
|
show 4 more comments
Could you show use your receiveJSONdata?
– D-Shih
Nov 14 at 7:55
Add yourCreateItemModelto the question
– user3559349
Nov 14 at 7:56
1
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
For point 1 -ItemDescis typeofstring- it does not have a property namedvalue
– user3559349
Nov 14 at 8:06
1
You need to modify the data you are sending if you want to use a Dictionary (using the defaultcontentTypeas you are doing, then it would bevar _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };
– user3559349
Nov 14 at 8:26
Could you show use your receive
JSON data?– D-Shih
Nov 14 at 7:55
Could you show use your receive
JSON data?– D-Shih
Nov 14 at 7:55
Add your
CreateItemModel to the question– user3559349
Nov 14 at 7:56
Add your
CreateItemModel to the question– user3559349
Nov 14 at 7:56
1
1
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
For point 1 -
ItemDesc is typeof string - it does not have a property named value– user3559349
Nov 14 at 8:06
For point 1 -
ItemDesc is typeof string - it does not have a property named value– user3559349
Nov 14 at 8:06
1
1
You need to modify the data you are sending if you want to use a Dictionary (using the default
contentType as you are doing, then it would be var _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };– user3559349
Nov 14 at 8:26
You need to modify the data you are sending if you want to use a Dictionary (using the default
contentType as you are doing, then it would be var _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };– user3559349
Nov 14 at 8:26
|
show 4 more comments
1 Answer
1
active
oldest
votes
up vote
1
down vote
(Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error.
Because there isn't a property ItemDesc,ItemQty,ItemQty in original javascript Object.
You can try to create an anonymous JSON object for your javascript code.
var _model = {
ItemDesc: {
value : "Descript"
},
ItemQty :{
num : 1,
unit :'pcs'
}
};
instead of
var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'
your c# model might look like because your currently ItemDesc is an object instead of a string value.
Why am I getting
nullsinItemQtyproperties?
Because default ModelBindiner can't find ExpandoObject with your JSON key ItemQty object.
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; }
}
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
(Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error.
Because there isn't a property ItemDesc,ItemQty,ItemQty in original javascript Object.
You can try to create an anonymous JSON object for your javascript code.
var _model = {
ItemDesc: {
value : "Descript"
},
ItemQty :{
num : 1,
unit :'pcs'
}
};
instead of
var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'
your c# model might look like because your currently ItemDesc is an object instead of a string value.
Why am I getting
nullsinItemQtyproperties?
Because default ModelBindiner can't find ExpandoObject with your JSON key ItemQty object.
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; }
}
add a comment |
up vote
1
down vote
(Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error.
Because there isn't a property ItemDesc,ItemQty,ItemQty in original javascript Object.
You can try to create an anonymous JSON object for your javascript code.
var _model = {
ItemDesc: {
value : "Descript"
},
ItemQty :{
num : 1,
unit :'pcs'
}
};
instead of
var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'
your c# model might look like because your currently ItemDesc is an object instead of a string value.
Why am I getting
nullsinItemQtyproperties?
Because default ModelBindiner can't find ExpandoObject with your JSON key ItemQty object.
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; }
}
add a comment |
up vote
1
down vote
up vote
1
down vote
(Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error.
Because there isn't a property ItemDesc,ItemQty,ItemQty in original javascript Object.
You can try to create an anonymous JSON object for your javascript code.
var _model = {
ItemDesc: {
value : "Descript"
},
ItemQty :{
num : 1,
unit :'pcs'
}
};
instead of
var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'
your c# model might look like because your currently ItemDesc is an object instead of a string value.
Why am I getting
nullsinItemQtyproperties?
Because default ModelBindiner can't find ExpandoObject with your JSON key ItemQty object.
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; }
}
(Bit of off topic) why
_model.ItemDesc.value = 'Descript'errors? On the other hand_model.ItemDesc = 'Descript'runs without error.
Because there isn't a property ItemDesc,ItemQty,ItemQty in original javascript Object.
You can try to create an anonymous JSON object for your javascript code.
var _model = {
ItemDesc: {
value : "Descript"
},
ItemQty :{
num : 1,
unit :'pcs'
}
};
instead of
var _model = new Object();
_model.ItemDesc.value = 'Descript';
_model.ItemQty.num = 1;
_model.ItemQty.unit = 'pcs'
your c# model might look like because your currently ItemDesc is an object instead of a string value.
Why am I getting
nullsinItemQtyproperties?
Because default ModelBindiner can't find ExpandoObject with your JSON key ItemQty object.
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; }
}
edited Nov 14 at 8:07
answered Nov 14 at 8:01
D-Shih
24.6k61431
24.6k61431
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53295349%2fjavascript-passing-null-to-an-expandoobject-field-in-c-sharp-controller-paramete%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Could you show use your receive
JSONdata?– D-Shih
Nov 14 at 7:55
Add your
CreateItemModelto the question– user3559349
Nov 14 at 7:56
1
in the ajax request change the data: _model to data: { item: JSON.stringify(_model) } as your api end point is expecting the item object
– Hassaan
Nov 14 at 7:57
For point 1 -
ItemDescis typeofstring- it does not have a property namedvalue– user3559349
Nov 14 at 8:06
1
You need to modify the data you are sending if you want to use a Dictionary (using the default
contentTypeas you are doing, then it would bevar _model = { ItemDesc.value: 'Descript', ItemQty[0].Key: 'num', ItemQty[0].Value: 1, ItemQty[1].Key: 'unit', ItemQty[1].Value: 'pcs' };– user3559349
Nov 14 at 8:26