Экспорт CSV с помощью Ajax-Post из View - ASP.NET MVC5 - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь загрузить файл CSV с моим видом.Я отладил метод контроллера, и он работал, и я вижу результат, но загрузка не начинается. Сеть> Ответ

Мой контроллер:

[HttpPost]
    public FileContentResult ReportExecution(int reportId, string parameters)
    {
        var paramDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(parameters);

        var data = this._reportsRepository
            .ExecuteReport
            (
                reportId,
                paramDictionary
            );

        //Response.AddHeader("content-disposition", "attachment;filename=CsVExport.csv");

        return this.File(data, "text/csv", "CsVExport.csv");
    }

MyView:

...
</form>
<button onclick="submitForm()">Check Form</button>

<script>

    function submitForm() {
        var form = $('#form');

        var obj = {};
        var elements = $("input, select, textarea", form);

        for (var i = 0; i < elements.length; ++i) {
            var element = elements[i];
            var name = element.name;
            var value = element.value;

            if (name) {
                obj[name] = value;
            }
        }

        console.log(obj);
        $.post("ReportExecution", { reportId: @ViewBag.ReportId, parameters: JSON.stringify(obj) });

    }

</script>

Не спрашивайте, для чего нужна эта странная процедура отправки,Нормальная отправка MVC5 не работает, потому что моя форма очень динамична, и я не могу передать модель в контроллер, потому что она постоянно меняется.

1 Ответ

0 голосов
/ 31 января 2019

Первое, что вам следует знать, это то, что AJAX POST не предназначен для выполнения действий по загрузке файлов.Вы можете создать контроллер с методом GET для загрузки файла, сгенерированного из ExecuteReport:

[HttpGet]
public FileContentResult Download(string fileName)
{
    var data = TempData["CSVFile"] as ...; // specify the type returned by ExecuteReport here

    if (data != null && !string.IsNullOrEmpty(fileName))
    {
        fileName = fileName + ".csv";

        return File(data, "text/csv", fileName);
    }
    else
    {
        // something went wrong
        return new EmptyResult();
    }        
}

Затем в свой вызов AJAX включите функцию success для перенаправления в контроллер, указанный выше, используя имя файла в качестве параметра и используйтеTempData / Session переменная для передачи содержимого файла:

AJAX POST

function submitForm() {
    var form = $('#form');

    var obj = {};

    // create object to pass into action parameter

    console.log(obj);
    $.post("ReportExecution", { reportId: @ViewBag.ReportId, parameters: JSON.stringify(obj) }, function (result) {
        location.href = '@Url.Action("Download", "ControllerName")' + '?fileName=' + result;
    });
}

POST action

[HttpPost]
public ActionResult ReportExecution(int reportId, string parameters)
{
    var paramDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(parameters);

    var data = this._reportsRepository
        .ExecuteReport
        (
            reportId,
            paramDictionary
        );

    // pass file content to TempData or Session variable
    TempData["CSVFile"] = data;

    string fileName = "CsVExport";

    // pass file name to redirect into download action
    return Json(fileName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...