Вернуть файл в JsonResult или вернуть данные Json в ActionResult?

Используя контроллер MVC3 .net на сервере, я выполняю HttpPost для отправки файла через HttpContext.

Когда сервер читает файл, возвращается список строк с результатами загрузки.

До сих пор мне удалось получить два работающих сценария:

1) Верните список строк как одну строку с разделителями табуляции как JsonResult

string tabSeparatedMessages = "";

foreach (string message in messageLog)
{
    tabSeparatedMessages = tabSeparatedMessages + message;

    if (message != messageLog[messageLog.Count - 1])
    {
        tabSeparatedMessages = tabSeparatedMessages + '\n';
    }
}
return this.Json(new
{
    success = true,
    total = messageLog.Count,
    data = tabSeparatedMessages
}, "text/html", JsonRequestBehavior.AllowGet);

2) Вернуть список строк в текстовом файле как ActionResult

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".txt";

using (StreamWriter writer = new StreamWriter(fileName))
{
    foreach (string message in messageLog)
    {
        writer.WriteLine(message);
    }
}

return File(fileName, "text/plain", "UPLOAD_RESULTS.txt");

Моя проблема в том, что мне нужны элементы из каждого из этих методов, но мне сложно их объединить. Мне нужен JsonResult, чтобы я мог вернуть логическое значение «успех» для выпуска модального ожидающего сообщения на клиенте. Мне нужен ActionResult, чтобы клиент мог просто загрузить файл, а не анализировать список строк в компонентах графического интерфейса.

Есть ли способ вернуть текстовый файл для загрузки как часть JsonResult или вернуть данные Json с помощью ActionResult?

Спасибо за чтение


person David Kaczynski    schedule 19.03.2012    source источник


Ответы (2)


К сожалению, вы можете возвращать только один тип результата за раз. Если бы я был вами, и мне действительно нужно было загрузить этот файл upload_results.txt на клиент, у меня был бы параметр в моем результате json, который является ссылкой на файл на сервере.

Таким образом, клиент сначала получает ответ, что загрузка прошла успешно, и вы скрываете модальное диалоговое окно, а затем с помощью javascript вы делаете еще один запрос для файла upload_results.txt.

person Tobias    schedule 19.03.2012
comment
Насколько я понимаю, контроллеры MVC3 разбираются после каждого запроса. Есть ли у вас или у кого-либо еще какие-либо рекомендации о том, как сохранить отношения пользователя к файлу между запросом на создание файла и запросом на загрузку? Я думаю о сохранении временного пути к файлу в базе данных вместе с пользователем, который его сгенерировал, но у одного пользователя все еще может быть несколько файлов, связанных с ним или с ней, и я не уверен, как гарантировать, что загружаемый файл из правильного запроса. - person David Kaczynski; 19.03.2012
comment
Сохраните файл в кеше на веб-сервере, используя ключ GUID, который отправляется клиенту и используется для вызова файла. Это решает проблему, если остаточные файлы на сервере в качестве записи кэша можно настроить на уничтожение через 5 минут или то, что вы сочтете подходящим. - person David Mårtensson; 19.03.2012
comment
Как описывает Дэвид, я бы так поступил. Ключ GUID - это тот, который вы хотите отправить в своем json-ответе, а затем запросить файл, помеченный этим GUID, в кеше или, если вы предпочитаете базу данных. - person Tobias; 19.03.2012
comment
Спасибо всем. Я очень ценю это. - person David Kaczynski; 19.03.2012

Я согласен с вышеизложенным, отправьте JSON и временно сохраните файл на веб-сервере. Укажите путь к этому файлу в формате JSON, а затем просто выполните GET

person Brian Warfield    schedule 19.03.2012