2010-02-10 3 views
13

НАСТРОЙКИ:ASP.NET MVC контроллер FileContent ActionResult вызывается через AJAX

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

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

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

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

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

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

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

+0

Почему вы не можете просто использовать не АЯКС вызов? – LukLed

+0

Я могу, но я хочу выполнить некоторую другую обработку в javaScript-функции после завершения сохранения, например разблокировать форму, которую я заблокировал до сохранения. – Rick

+0

ОК, поэтому вы можете сначала вызвать ajax SaveFile. SaveFile вернет true/false. Когда он возвращает true, вы вызываете не-ajax GET для получения файла. – LukLed

ответ

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(); 
    } 
} 
+0

Nate, спасибо за предоставление такого подробного примера. Я ценю это, а также благодарю LukLed за то, что вы старательно объяснили свое решение. Точка, которая не погружалась, заключалась в том, что первый вызов подготовил данные для сохранения, а второй - загрузку. – Rick

+0

Я был там, прежде чем ударить головой о стену, говоря, что WTF пытается понять, не беспокоится. Рад помочь. –

Смежные вопросы