Formcollection无法使用“=”处理JSON

时间:2012-10-03 00:14:38

标签: json asp.net-mvc-3 stringify

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

$.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无法处理这些值......

1 个答案:

答案 0 :(得分: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) {
    ...
});

现在可以通过FormCollection

以两种方式之一访问原始JSON
[HttpPost]
public ActionResult PostComment(FormCollection fields)
{
    string jsonComment = fields["jsonComment"];
    ...
}

或直接按名称:

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

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