Вопрос по ajax, asp.net, asp.net-mvc – Контроллер ASP.NET MVC FileContent ActionResult вызывается через AJAX

13

Настройка:

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

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

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

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

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

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

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

Почему вы не можете просто использовать не-AJAX вызов? LukLed
Я могу, но я хочу выполнить некоторую другую обработку в функции javaScript после завершения сохранения, например разблокировать форму, которую я заблокировал перед сохранением. Rick
Итак, вы можете сначала вызвать ajax SaveFile. SaveFile вернет true / false. Когда он возвращает true, вы вызываете non-ajax GET, чтобы получить файл. LukLed
Я ценю ваше упорство в помощи. Я не понимаю, «начальный не-AJAX получить для загрузки файла». Таким образом, вы предлагаете, чтобы я вызывал SaveFile контроллера (который на самом деле идет в БД и создает буфер памяти, полный данных, разделенных запятыми) и вместо возврата FileContentResult (который вызывает загрузку диалогового окна загрузки браузера), я возвращаю этот буфер в вызывающую функцию и затем пытаюсь вызвать диалоговое окно для сохранения буфера из функции javascript. Если это так, как мне получить javascript для открытия диалога и сохранения возврата буфер данных? Rick

Ваш Ответ

1   ответ
16

который я сделал. Это концепция, о которой 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();
    }
}
Я был там прежде, чем ударился головой о стену, говоря WTF про себя, пытаясь понять, не волнуясь. Рад помочь. Nate Pinchot
Нейт, спасибо за такой подробный пример. Я ценю это, а также благодарю LukLed за старательное объяснение вашего решения. Дело не в том, что первый вызов подготовил данные для сохранения, а второй вызов загрузил. Rick

Похожие вопросы