当我尝试做这样的事情时:
$.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无法处理这些值......
答案 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
:
[HttpPost]
public ActionResult PostComment(FormCollection fields)
{
string jsonComment = fields["jsonComment"];
...
}
或直接按名称:
[HttpPost]
public ActionResult PostComment(string jsonComment)
{
...
}
需要这种包装,因为FromCollection
不能直接使用JSON,它不是为它设计的。您需要发布正确的表单数据,但您可以将JSON作为一个没有问题的值(并且您也可以在该表单数据中包含其他简单值)。