我的原始json字符串通过AJAX post
传递给MVC ActionResult控制器{"ID":0,"RoutingRuleID":24,"ConditionalType":0,"Field":"Channel","ConditionalOperator":"5","Values":[1,9],"ValueString":""}
但最终发生的事情是,一旦json对象进入MVC控制器,它就会丢失关联数组“值”中的值。其他属性设置正确。
我在C#中的模型类如下:
public class RoutingConditional
{
public int ID { get; set; }
public int ParentID { get; set; }
public string ConditionalType { get; set; }
public string Field { get; set; }
public string ConditionalOperator { get; set; }
public List<string> Values { get; set; }
public string ValueString{get;set;}
public RoutingConditional()
{
//this.Values = new List<string>(); //I tried to initialize it too did not work
}
}
我的MVC控制器
[HttpPost]
public ActionResult EditConditional(RoutingConditional rcview)
{
//rcview.Values = null
}
我的Javascript
$.ajax({
url: actionURL,
type: "post",
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(myModel.RoutingConditional),
........standard success and error
});
为什么它被作为null传递给数组(List)?
答案 0 :(得分:6)
这是一个奇怪的,不确定我可以完全解释(有一个想法),但这就是我做的。
除了"Values":[1,9]
之外,在有效负载中删除了所有json参数,它工作得很好。
所以开始从最后开始添加每个json参数(幸运的是)。当我重新添加"ValueString":""
时,它再次被淘汰出局。
因此,添加了一些json参数,以查看它是否是一个排序问题(例如,没有任何东西可以在数组之后)。情况并非如此。
所以我开始重命名这些内容,当我将"ValueString":""
重命名为"TmpValueString":""
时,它再次发挥作用。
这是我最好的猜测。 ValueString这个单词的名称与第一个字符的另一个属性相匹配。在这种情况下,“ values -tring”与“ values ”(数组名称)匹配,从而在与对象模型匹配时抛弃MVC活页夹。我不是百分之百,但这就是它的样子。
所以你的解决方案是重命名你的一个道具,使它的名字不构成另一个道具的第一个角色。
另外,想提及ConditionalOperator和ConditionalType名称来反驳任何参数。这些名称的独特之处在于它们不是彼此的子集,而只是包含相同的字符。而值是Valuestring的一个子集,因此我认为这会引起混淆。
答案 1 :(得分:2)
尝试设置“traditional”选项
$.ajax({
url: actionURL,
type: "post",
dataType: 'json',
traditional: true,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(myModel.RoutingConditional),
........standard success and error
});