2

我正在尝试将一个对象从 jquery 发布到 MVC 控制器。该对象已成功传递,但所有属性均为空(或布尔为假)。

fwiw,如果我 JSON.stringify myObect 那么它根本不通过,控制器中的 theObect 为空。

我正在使用 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 中,我不能使用这种技术传递任何其他参数。也很好奇为什么我在网上找到的所有信息,包括官方教程,都说使用 data: JSON.Strinify(myObect) 但对我来说这会导致 myObject 的所有属性为空(或假)。

仍然感谢咆哮,至少我可以超越这一点。

4

6 回答 6

1

尝试这个

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data: myObject
});
于 2013-05-22T16:05:09.193 回答
1

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

你可以试试这个:

$.ajax({
    contentType: 'application/json',
    data: { theObject: myObject },
    dataType: 'json',
    type: 'POST',
    url: '/myController/StartProcess/'
});
于 2013-05-23T08:15:30.563 回答
1

获取这个JSON 库和类似stringify()object东西:

$.ajax({
    type: 'POST',
    url: '/myController/StartProcess/',
    data: JSON.stringify(myObject)
});
于 2013-05-22T16:04:30.077 回答
1

这也可以使所有属性为 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&CardModel.bar 模型绑定器认为它是理所当然的,并尝试匹配发送的实例它不能为您实例化一个新实例的控制器的属性,因此所有属性都是空值。

于 2017-12-01T18:07:16.960 回答
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; }
}
于 2013-05-23T09:15:58.713 回答
0

尝试将 contentType: "application/json; charset=utf-8" 添加到您的 ajax 调用中。

于 2013-05-23T04:03:00.030 回答