0

当我尝试做这样的事情时:

$.post('@Url.Action("PostComment")', {"Id":32,"Title":"=","Desc":"=",}, function (data) {
    ....
}

我的控制器在 FormCollection 中接收到这个值:

public ActionResult PostComment(FormCollection comment) {
    ....
}

奇怪的是,这个值看起来像:

","Desc":"="}

(该值使用: JSON.stringify( { Id: 32, Title: "=", Desc: "=" })

但是,当字符不是“=”时,对象被正确接收。

如何发送带有此特殊字符的 JSON 对象?似乎 MVC3 无法处理这些值......

4

1 回答 1

1

我对你真正想要发送的内容有点困惑,所以我将描述这两种情况。

您的 JavaScript 片段和操作方法会建议您发送application/x-www-form-urlencoded- 在这种情况下,您不应该JSON.stringify在您的数据上使用,一切都应该正常工作。

但是如果你真的想发送 JSON ( application/json),那么你的 JavaScript 应该有点不同:

$.ajax({
    type: 'POST',
    url: '@Url.Action("PostComment")',
    data: JSON.stringify( { Id: 32, Title: '=', Desc: '=' }),
    contentType: 'application/json',
    success: function(result) {
    ...
    }
});

您还应该为实体获取一个类(它也可以用于application/x-www-form-urlencoded数据):

public class Comment
{
    public int Id { get; set; }

    public string Title { get; set; }

    public string Desc { get; set; }
}

它允许您像这样更改您的操作方法(同样,这也可以用于application/x-www-form-urlencoded数据):

public ActionResult PostComment(Comment comment)
{
    ...
}

ASP.NET MVC 将正确绑定数据,只需确保您以正确的格式和正确的内容类型发送数据,并且 JSON 应该绑定到对象。

更新

您的评论中还出现了另一种情况 - 将 JSON 作为表单中的字段值发布。要实现这一点,您应该首先将 JavaScript 更改为如下所示:

$.post('@Url.Action("PostComment")', { jsonComment: JSON.stringify({ Id: 32, Title: '=', Desc: '=' }) }, function (data) {
    ...
});

现在可以通过以下两种方式之一访问原始 JSON FormCollection

[HttpPost]
public ActionResult PostComment(FormCollection fields)
{
    string jsonComment = fields["jsonComment"];
    ...
}

或直接按名称:

[HttpPost]
public ActionResult PostComment(string jsonComment)
{
    ...
}

这种包装是必需的,因为FromCollection不能直接使用 JSON,它不是为它设计的。您需要发布正确的表单数据,但您可以毫无问题地将 JSON 作为值(并且您也可以在该表单数据中包含其他简单值)。

于 2012-10-03T11:40:18.910 回答