【问题标题】:Empty parameter on a MVC 4 ApiController actionMVC 4 ApiController 操作上的空参数
【发布时间】:2013-02-26 20:23:50
【问题描述】:

我正在将一个字符串集合的 Javascript 数组传递给我的 apicontroller 上的 post 操作,有一个数据正在发送(我通过 fiddler 知道这一点)但它似乎并没有真正到达控制器操作当我正在调试代码。我的代码如下,任何帮助将不胜感激。

编辑:为了澄清,控制器动作被调用,但是当有一个列表被传递给它时,List stuffsId 的计数为零

Ajax/Javascript

my.sendStuffToController = function (stuffIds, completedHandler) {

        $.ajax({
            dataType: 'json',
            type: 'POST',
            url: my.stuffUrl,
            data: {
                stuffIds: stuffIds
            },
            success: function (data) {

                if (completedHandler !== undefined) {
                    completedHandler(stuffIds);
                }
            }
        });
    };

我的 ApiController 发布操作

    // Post 
    public void PostAsync(List<string> stuffIds)
    {
        var clientProxy = this.proxyFactory.CreateClientProxy(Tokens.EndPoint);
        var clientChannel = clientProxy.GetClientChannel();

        try
        {
            clientChannel.DoStuffAsync(stuffIds);
        }
        finally
        {
            clientProxy.TryCloseAbortClientChannel();
        }
    }

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-web-api


    【解决方案1】:

    dataType用于指定请求的返回类型。 contentType 是你应该用来告诉服务器你正在发送什么。

    【讨论】:

    • 将其从 dataType 更改为 contentType 似乎没有任何作用
    • @PhilipLoyer 您是否将内容类型设置为 application/json ?
    • 所以事实证明这是问题的一部分,但这是一个关键部分。所以这就是我为彻底解决它所做的。我将 public void PostAsync(List stuffIds) 更改为 public void PostAsync([FromBody] IEnumerable stuffIds) 并在我的 javascript 数据中: { stuffIds: stuffIds } 更改为 data: JSON.stringify(stuffIds),跨度>
    【解决方案2】:

    here 描述了从 jQuery 将数组作为 post 参数传递的一个可能(也是最常见的)问题。

    短版:

    添加

    jQuery.ajaxSettings.traditional = true;
    

    在您的 jQuery ajax() 函数调用之前,即

    jQuery.ajaxSettings.traditional = true;
    my.sendStuffToController = function (stuffIds, completedHandler) {
    
            $.ajax({
                dataType: 'json',
                type: 'POST',
                url: my.stuffUrl,
                data: {
                    stuffIds: stuffIds
                },
                success: function (data) {
    
                    if (completedHandler !== undefined) {
                        completedHandler(stuffIds);
                    }
                }
            });
        };
    

    长版:

    如果变量是数组,jQuery 从某个时间点开始将方括号附加到变量名,即在您的情况下,它将通过 ajax 调用传输 'stuffIds[]:value1 stuffIds[]:value2' 等。 ASP.NET MVC 不喜欢这样并且拒绝接受这样的参数。 jQuery.ajaxSettings.traditional = true 关闭这个 jQuery 的“功能”。

    【讨论】:

    • 确实删除了括号,但是当 apicontroller 动作触发时我仍然得到零计数。
    猜你喜欢
    • 2013-02-27
    • 2013-01-08
    • 1970-01-01
    • 2013-02-06
    • 2014-02-21
    • 2012-09-28
    • 2016-02-06
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多