将对象AJAX发布到MVC控制器会导致所有属性为null

时间:2013-05-22 16:00:26

标签: asp.net-mvc jquery

我正在尝试将对象从jquery发布到MVC控制器。对象成功传递,但所有属性都为null(对bool而言为false)。

fwiw,如果我JSON.stringify myObect然后根本没有通过,控制器中的Obect为空。

我正在使用MVC4,.net 4.5,jQuery 1.9.1

任何帮助表示赞赏。

jQuery功能

var myObject =
{
    Property1: true,
    Proerty2: true
};

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data: { theObject: myObject }
});

控制器

private async void StartProcess(myObject theObject)
{
     // theObect can be seen successfully but property1 and property2 are false
     // if I change them to strings they are null
     ...
}

public class myObject
{
    public bool Property1 { get; set; }
    public bool Property2 { get; set; }
}

修改

解决方案是:

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data:  myObject
});

如果有人能够阐明为什么这样有效,而没有其他任何事情,那将非常感激。这不是一个很好的解决方案,因为我必须将所有参数放在myObject中,我不能使用这种技术传递任何其他参数。同样好奇为什么我在网上找到的所有信息,包括官方教程,都说要使用数据:JSON.Strinify(myObect),但对我来说这会导致myObject的所有属性为null(或false)。

感谢Roar一样,至少我可以超越这个。

6 个答案:

答案 0 :(得分:1)

获取此JSON librarystringify() object,如下所示:

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data: JSON.stringify(myObject)
});

答案 1 :(得分:1)

试试这个

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data: myObject
});

答案 2 :(得分:1)

如果您尝试将对象POST到API控制器,它可能会起作用。我自己也遇到了一些麻烦。如果您正在使用jQuery,则需要指定您正在发送JSON,以便MVC控制器正确解释数据。

你可以试试这个:

$.ajax({
    contentType: 'application/json',
    data: { theObject: myObject },
    dataType: 'json',
    type: 'POST',
    url: '/myController/StartProcess/'
});

答案 3 :(得分:0)

尝试在您的ajax调用中添加contentType:“application / json; charset = utf-8”。

答案 4 :(得分:0)

好的,终于明白了。这是一个完整而恰当的解决方案,展示了如何将附加参数与对象一起传递:

<强> jQuery的:

var myString= "my paramter";
var myObject =
{
     Property1: true,
     Property2: true
};

var DTO = { param1: myString, param2: myObject };

$.ajax({
    contentType: "application/json; charset=utf-8",
    type: 'POST',
    url: 'myController/StartProcess',
    data: JSON.stringify(DTO)
});

<强>控制器:

[HttpPost] // notice this additional attribute!
private async void StartProcess(string param1, myObject param2)
{
     // param2 parameters are all true! param1 shows correctly too.
     ...
}

<强>类

public class myObject
{
    public bool Property1 { get; set; }
    public bool Property2 { get; set; }
}

答案 5 :(得分:0)

这也可以使所有属性为null:

public ActionResult GetPaymentView(CardModel Card)
{
}

如果视图是模型的集合,则当您将集合中的一个元素的序列化形式传递给ajax调用时,控制器需要与类名称相同的名称实例。我认为这是没有收集的相同方式,但从未尝试过。在此代码示例中,我们序列化集合的一个元素

$.ajax({
    url: '/Shipments/GetPaymentView',
    type: 'POST',
    data: $('#' + ID).serialize(),
    success: { onSuccess(); },
    error: { onError(jqXHR, textStatus, errorThrown); }
});

发生这种情况的原因是因为视图模型是CardModel的集合,并且序列化在每个属性之前添加 CardModel :CardModel.ID = foo&amp; CardModel.bar模型绑定器将它视为已授予并尝试匹配使用它无法控制的属性发送的实例,并为您实例化一个新实例,因此所有属性都为空。