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

本文关键字:文件 返回 json MVC NET 控制器 获取 ASP | 更新日期: 2023-09-27 18:36:04

我有一个 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控制器时返回一个文件以供下载。但根本什么也没发生。错误在哪里?

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

好吧,

你不需要ajax来尝试这个

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

根据您的需求,您可以做这样的事情

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

我相当确定您正在做的是在 AJAX 调用中吞下成功回调中的数据 - 您的代码所做的只是下载文件,调用success回调,然后只需将"确定"打印到控制台。

正如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"
    }
}

然后,如果您只使用上面表单中的格式,它将提交良好 - 此参考解释了如何提交到深度模型。