当前情景
我在vs2012上使用MVC 4,.net 4.5。我有一个接受自定义类型的操作。此自定义类型(模型)与视图紧密绑定。我正在使用JSON通过AJAX进行POST。邮政只发布相关数据而没有表格。其内容类型为“application / json; charset = UTF-8”。我在行动中获得了一个人工填充(阅读有效)的模型。
问题
现在我需要添加自定义过滤器,但我无法通过Request,Request.Form,Request.Param访问数据?我一直在寻找System.Web.HttpContext.Current。如果数据在我的模型中填充,那么它必须位于请求本身的某个位置。我想我错过了更精细的印刷品。
发布数据的javascript有点像
$("#postData").click(function (event) {
var savedObject = getJson(savedObject, parentContext);
$.ajax({
url: '/controller/action',
contentType: 'application/json',
dataType: 'json',
data: savedObject,
type: "POST",
success: successCallBack,
error: errorCallBack
});
});
答案 0 :(得分:1)
我不知道你的代码是什么但是。如果从你调用jQuery.ajax中删除contentType:“application / json; charset = utf-8”,将使用默认内容类型(form-urlencoded)和json您指定为数据参数的数据(数据:{i:i,s:s,b:b})将正确映射到您的操作参数....因此除非您确实要发送json数据,否则只需删除contentType你会没事的......看看this
答案 1 :(得分:1)
我看到了您声明的仅发送JSON数据的愿望。如果确实需要坚持这一点,您可以通过Request.InputStream
访问原始参数。
控制器:
var input = new StreamReader(Request.InputStream).ReadToEnd();
这将为您提供一个可以手动解析的URL编码字符串。
真的,我会建议Shahrooz的答案是你想要去的地方的正确方法。
如果控制器的Request.Form没有为您的Ajax帖子填充,可能是因为您手动序列化并将数据发送到控制器,其内容类型为application/json
(常见情况)。
这是一个jQuery.ajax示例, NOT 在控制器上填充Request.Form。
// JSON serialized form data.
var data = {"id" : "1234", "name" : "Dave"};
$.ajax({
type: "POST",
url: serviceUrl,
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data || {}),
success: function () { }
});
更改contentType将导致控制器像表单提交一样处理帖子。
// Form encoded data.
var data = {"id" : "1234", "name" : "Dave"};
data = $.param(data);
$.ajax({
type: "POST",
url: serviceUrl,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
dataType: "json",
data: data,
success: function () { }
});
您还可以将contentType未定义为application/x-www-form-urlencoded; charset=UTF-8
,这是jQuery默认值。