ASP.NET MVC - 访问参数未通过表单发布

时间:2013-01-31 06:21:40

标签: asp.net-mvc c#-4.0 asp.net-mvc-4



当前情景

我在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
    });
});

2 个答案:

答案 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默认值。

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