Контроллер ASP.NET MVC FileContent ActionResult вызывается через AJAX - PullRequest
13 голосов
/ 11 февраля 2010

Настройка :

Контроллер содержит метод public ActionResult SaveFile(), который возвращает FileContentResult.

Что работает :

Представление содержит форму, которая подчиняется этому действию. Результат этого диалога: enter image description here

Что не работает :

Представление содержит некоторый javascript для выполнения вызова AJAX для того же действия контроллера, где будет публиковаться форма. Вместо запуска вышеупомянутого диалогового окна или даже функции успеха AJAX, ответ вызывает функцию ошибки AJAX, а XMLHttpRequest.responseText содержит ответ файла.

Что мне нужно сделать:

Сделайте запрос на файл, используя AJAX, и получите тот же результат, что и при отправке формы. Как сделать так, чтобы запрос AJAX предоставлял диалоговое окно, в котором отображается отправка формы?

1 Ответ

16 голосов
/ 11 февраля 2010

Вот быстрый пример, который я сделал. Это концепция, о которой LukLed говорил с вызовом SaveFile, но не возвращает содержимое файла через ajax и вместо этого перенаправляет на загрузку.

Вот код просмотра:

<script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(function() {
        // hide form code here

        // upload to server
        $('#btnUpload').click(function() {
            $.ajax({
                type: 'POST',
                dataType: 'json',
                url: '<%= Url.Action("SaveFile", "Home") %>',
                success: function(fileId) {
                    window.location = '<%= Url.Action("DownloadFile", "Home") %>?fileId=' + fileId;
                },
                error: function() {
                    alert('An error occurred uploading data.');
                }
            });
        });
    });
</script>

<% using (Html.BeginForm()) { %>

    <div>Field 1: <%= Html.TextBox("field1") %></div>

    <div>Field 2: <%= Html.TextBox("field2") %></div>

    <div>Field 3: <%= Html.TextBox("field3") %></div>

    <button id="btnUpload" type="button">Upload</button>

<% } %>

Вот код контроллера:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public JsonResult SaveFile(string field1, string field2, string field3)
    {
        // save the data to the database or where ever
        int savedFileId = 1;

        // return the saved file id to the browser
        return Json(savedFileId);
    }

    public FileContentResult DownloadFile(int fileId)
    {
        // load file content from db or file system
        string fileContents = "field1,field2,field3";

        // convert to byte array
        // use a different encoding if needed
        var encoding = new System.Text.ASCIIEncoding();
        byte[] returnContent = encoding.GetBytes(fileContents);

        return File(returnContent, "application/CSV", "test.csv");
    }

    public ActionResult About()
    {
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...