【问题标题】:ASP.NET MVC post controller get json, generate file and return itASP.NET MVC 后控制器获取 json,生成文件并返回
【发布时间】:2013-10-20 17:46:42
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 但是我的 jsonData 真的很大。我认为,以这种方式通过它是不可能的。下载文件生成的另一个问题取决于 jsonData。
【解决方案2】:

我很确定您正在做的是在 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 解释了如何提交到深度模型。

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2017-05-18
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多