我有一个字符串化的JSON对象,它在警报中正确显示,在浏览器调试器的中的post部分正确显示,但在控制器中它显示为null 。我不确定它是如何丢失信息的。
这是JS代码:
var assessmentStatus = [];
$("select.assessmentSelect").each(function () {
assessmentStatus.push({
assessmentname: $(this).attr("id"),
assessmentstatus: $(this).val()
});
});
alert(JSON.stringify(assessmentStatus));
$.ajax({
url: '@Url.Action("testAS")',
type: "POST",
contentType: 'application/json',
data: JSON.stringify({
AS: assessmentStatus,
AS2: assessmentStatus
})
});
这是警报中出现的内容:
[{"assessmentname":"testassessment","assessmentstatus":"Design"},{"assessmentname":"DepressionUpload","assessmentstatus":"Design"}]
这是帖子中出现的内容:
[Object { assessmentname="testassessment", assessmentstatus="Design"}, Object { assessmentname="DepressionUpload", assessmentstatus="Design"}]
我的控制器看起来像这样:
public ActionResult testAS (string[] AS, string AS2)
string[] AS returns [0]null [1]null
string AS2 just returns null.
为什么在发送到控制器时没有得到字符串化?
答案 0 :(得分:2)
您似乎试图传递具有2个属性的复杂对象数组:
assessmentStatus.push({
assessmentname: $(this).attr("id"),
assessmentstatus: $(this).val()
});
到一个简单的字符串数组:string[] as
。这显然不会奏效。
首先定义一个视图模型:
public class AssessmentViewModel
{
public string Name { get; set; }
public string Status { get; set; }
}
然后调整你的控制器动作:
public ActionResult TestAS(AssessmentViewModel[] assessments)
{
...
}
最后你的javascript:
var assessments = [];
$('select.assessmentSelect').each(function () {
assessments.push({
name: $(this).attr("id"),
status: $(this).val()
});
});
$.ajax({
url: '@Url.Action("testAS")',
type: "POST",
contentType: 'application/json',
data: JSON.stringify({ assessments: assessments })
});
答案 1 :(得分:1)
您不必自己编码参数,看起来像是一个简单的操作。只需将jQuery与您的属性一起交给对象,它就会为您编码。
$.ajax({
url: '@Url.Action("testAS")',
type: "POST",
contentType: 'application/json',
data: {
AS: assessmentStatus,
AS2: assessmentStatus
)
});
答案 2 :(得分:1)
我之前遇到过这种情况。你需要设置jQuery的ajaxSettings.traditional = true。前一段时间,他们改变了序列化数组的方式。它搞砸了asp.net mvc。
这个问题谈到了它:
How can I post an array of string to ASP.NET MVC Controller without a form?
就像这样: http://forum.jquery.com/topic/nested-param-serialization
所以就这样说:
jQuery.ajaxSettings.traditional = true;
然后就像Pointy说的那样,并且不要对你的数据进行字符串化。