Web API post参数

时间:2015-02-20 15:59:53

标签: javascript c# asp.net-web-api

我目前在使用webapi时遇到问题。我想用我的ApiController下载并打开一个日志文件。 我使用javascript函数将文件名发布到我的控制器。

这是一个发布参数的辅助函数(来自dystroy的回答): How to replace window.open(...) with a POST

现在当我在控制器中使用一个简单的字符串作为参数时,我无法获取参数,它总是为空。

public HttpResponseMessage PostDownloadLogFile([FromBody]string psFileName)
{
    //psFileName is always null

但是,如果我使用HttpReqeustMessage作为参数并从我的请求中读取表单数据,那就没问题了。它可以工作。

public HttpResponseMessage PostDownloadLogFile(HttpRequestMessage poRequest)
{
    var loFormData = poRequest.Content.ReadAsFormDataAsync().Result;
    string psFileName = loFormData["psFileName"]; //psFileName is set correct

是否有解决方案在控制器中使用简单参数获取参数?

更新

这是我的javascript帮助函数:

var loOpenWindow = function (psMethode, psUrl, poData, psTarget) {
    var loForm = document.createElement("form");
    loForm.action = psUrl;
    loForm.method = psMethode;
    loForm.target = psTarget || "_self";
    if (poData) {
        for (var lsKey in poData) {
            var loInput = document.createElement("textarea");
            loInput.name = lsKey;
            loInput.value = typeof poData[lsKey] === "object" ? JSON.stringify(poData[lsKey]) : poData[lsKey];
            loForm.appendChild(loInput);
        }
    }
    loForm.style.display = "none";
    document.body.appendChild(loForm);
    loForm.submit();
};

称之为:

helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { "psFilename": $scope.data.showLogEntry.FullName });

客户端代码应该没有问题,因为HttpReqeustMessage的控制器方法没有问题。

以下是浏览器请求: enter image description here

2 个答案:

答案 0 :(得分:1)

问题可能在于客户端代码发送数据。

  

[FromBody]参数必须编码为=value

然后,这不起作用:

// Value will be null.
$.post('api/values', value);

// Value will be null.
$.post('api/values', { key: value });

但是这项工作:

$.post('api/values', "=" + value);

尝试更改您的客户端代码,以便只在正文中发送=/path/to/your/file

参考:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

答案 1 :(得分:1)

好的,我找到了解决方案。 如果我使用class作为参数和具有给定名称的属性,它似乎可以工作。

public class Param
{
    public string psFileName { get; set; }
}

public HttpResponseMessage PostDownloadLogFile(Param poParam)
{
    string psFileName = poParam.psFileName; //psFileName is set correct

这不是一个简单的参数,但我可以使用这个解决方案。