一些JSON字段在命中MVC Controller方法时显示为NULL

时间:2014-12-11 01:11:23

标签: javascript jquery ajax json asp.net-mvc-4

提交ajax调用后,我在请求标头中确认所有json字段都有值。我不明白的是,当我在服务器端调试时,只有DateEntered字段有一个值(解析为DateTime对象)。当我在使用Postman时输入相同的信息时,它在服务器上工作正常(所有字段都有值)。

控制器方法:

[HttpPost]
public JsonResult SaveJobApplication(ApplicationFormObject jobApplicationObject)
{
    return Json(_jobApplicationController.SaveJobApplication(jobApplicationObject), JsonRequestBehavior.AllowGet);
}

Ajax电话:

$.ajax({
    url: 'http://myurl.com/SaveJobApplication',
    data: JSON.stringify(applicationInfo),
    contentType: 'application/json',
    type: 'POST'
}).done(function(message) {
    // do some stuff
});

以下是上下文:

ajax请求来自不同的来源' http://somedomain.com'而不是我的服务器来源' http://myserverdomain.com'。我已经在Web.Config文件中实现了CORS,如下所示:

...
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
...

这已经过测试,工作正常(我的服务器可以授予其他来源的ajax请求)。

我提交的json对象是这样的:

var applicationInfo = {
    FirstObject: {
        'NameFirst': 'blah blah',
        'NameLast': 'blah blah blah',
        'DateEntered': '2012-5-5'
    },
    SecondObject: {
        'LastJob': 'blah blah',
        'ReasonQuit': 'blah blah blah'
    }
}

服务器上的类/对象是这样的:

// Object that ajax is utilizing
public class ApplicationFormObject
{
    public FirstObject FirstObject { get; set; }
    public SecondObject SecondObject { get; set; }
}

public class FirstObject
{
    public string NameFirst { get; set; }
    public string NameLast { get; set; }
    public DateTime? DateEntered{ get; set; }
}

public class SecondObject 
{
    public string LastJob { get; set; }
    public string ReasonQuit { get; set; }
}

重要信息

我发送的json对象是动态创建的。我实际上是通过ajax .each遍历表单元素。对于每个元素,我将它添加到一个对象中:

var applicationInfo = {};

$('form input, form select').each(function() {
    var that = $(this);
    if(isValid(that)) {
        applicationInfo["'" + that.attr('id') + "'"] = that.val();
    }
});

当我查看请求标头时,它会将JSON显示为以下格式:

{
    ...
    'demoObject': "Value of demo object"
    ...
}

但是,当我在Postman上测试时,该对象不是动态创建的。我明确地为测试数据逐个填充json对象。当我查看此方法的请求标头时,它会将JSON显示为以下格式:

{
    ...
    demoObject: "Value of demo object"
    ...
}

不同之处在于第二个示例没有单引号,而第一个示例没有。希望这些信息有意义。请告诉我如何澄清。

1 个答案:

答案 0 :(得分:0)

您传递的是无效的模型。

修改您的代码,如下所示:

[HttpPost]
public JsonResult SaveJobApplication(JobApplication jobApplication)
{
    return Json(_jobApplicationController.SaveJobApplication(jobApplicationObject), JsonRequestBehavior.AllowGet);
}