ASP.NET MVC post控制器获取json,生成文件并返回它

时间:2013-10-20 17:46:42

标签: c# ajax asp.net-mvc json post

我有一个ajax帖子请求:

  function downloadElevationMap() {
    var jsonData = ko.toJSON(mod.SelectedItem);
    $.ajax({
        url: '/Home/GetData/',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: jsonData,
        success: function (data) {
            console.log("OK");
        },
    });
}

控制器方法使数据正确。代码如下:

public FileStreamResult GetData(Mv jsonData)
        {
            var resultAll = jsonData.Data.Select(d => d.y).ToList();
            var str = new StringBuilder();
            _fileName = "ses"+jsonData.Path;
            foreach (var d in resultAll)
            {
                str.Append(d + " ");
            }
            var byteArray = Encoding.ASCII.GetBytes(str.ToString());
            var stream = new MemoryStream(byteArray);
            return File(stream, "text/plain", string.Format("{0}.txt", _fileName));
        }

Mv - 是我的代表数据的类。调试时,str和流variable都包含正确的数据。

downloadElevationMap()

调用函数onclick="downloadElevationMap()"

我只想在调用downloadElevationMap()GetData控制器返回一个文件进行下载。但根本没有任何事情发生。错误在哪里?

2 个答案:

答案 0 :(得分:2)

你不需要ajax就可以试试这个

window.location="download.action?para1=value1...."

根据您的需要,您可以做一些像这样的事情

window.location="/Home/GetData/?"+$.param(jsonData )

答案 1 :(得分:1)

我很确定你正在做的是吞下AJAX调用中成功回调中的数据 - 你所做的所有代码都是下载文件,调用success回调,然后只打印“OK” “到控制台。

正如Anto所说,你不需要AJAX(事实上,不应该使用AJAX)。如果您可以使用GET字符串,他的回答绝对正确。如果您需要使用POST请求,请创建一个包含隐藏输入的表单并提交 - 例如:

<强> HTML

<form action="/Home/GetData" method="POST" id="dataToSubmit">
   <input type="hidden" name="param1" value="value1" />
   <input type="hidden" name="param2" value="value2" />
   <input type="hidden" name="param3.param4" value="value3" />
</form>

<强> JS

function downloadElevationMap() {
  // Write code to map your jsonData to your form elements

  $('#dataToSubmit').submit();
}

如果您愿意,可以动态制作表单。您可以使用提交按钮更新您的页面以直接发布。

最后一点,您不需要以Json的身份提交数据。如果你有

{
    "param1": "value1",
    "param2": "value2",
    "param3": {
        "param4": "value3"
    }
}

然后,如果你只是使用上面表单中的格式,它将提交正常 - this reference解释如何提交给深层模型。