0



当前场景

我在 vs2012 上使用 MVC 4、.net 4.5。我有一个接受自定义类型的操作。此自定义类型(模型)与视图紧密绑定。我正在使用 JSON 通过 AJAX 进行 POST。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
    });
});
4

2 回答 2

1

我看到您希望只发送 JSON 数据。如果你真的需要坚持这一点,你可以通过Request.InputStream.

控制器:

var input = new StreamReader(Request.InputStream).ReadToEnd();

这将为您提供一个可以手动解析的 URL 编码字符串。

真的,我会推荐 Shahrooz 的答案作为到达你想去的地方的正确方法。

如果控制器的 Request.Form 没有为您的 Ajax 帖子填充,可能是因为您手动序列化数据并将数据发送到 contentType 为的控制器application/json(常见场景)。

这是一个不会在控制器上填充 Request.Form 的 jQuery.ajax 示例。

    // 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 的默认值。

我会注意到我只使用$.ajax来更好地说明正在发生的事情。您也可以使用$.post,尽管您仍然需要发送表单编码数据

于 2013-03-12T15:09:55.363 回答
1

我不知道您的代码是什么,但是如果您从对 jQuery.ajax 的调用中删除 contentType: "application/json; charset=utf-8" ,则将使用默认内容类型(form-urlencoded)和您拥有的 json 数据指定为您的数据参数 (data: { i: i, s: s, b: b }) 将正确映射到您的操作参数....所以除非您真的想发送 json 数据,否则只需删除 contentType 即可没事……看看这个

于 2013-01-31T06:32:32.573 回答