Ответ, который я придумал, не такой общий, как хотелось бы, но это решение является функциональным.
public class MyController : Controller
{
public void Index()
{
PropertyBag["includeZeroBalances"] = false;
PropertyBag["toDate"] = DateTime.Today.ToShortDateString();
}
public void Download(bool includeZeroBalances, DateTime toDate)
{
MyProxy proxy = GetProxy();
byte[] file = proxy.GetFile(includeZeroBalance, toDate);
PropertyBag["downloadurl"] = "data:application/zip;base64," + System.Convert.ToBase64String(file);
}
}
Вот страница индекса
${Form.FormTag({@action: 'Download'})}
<table>
<tr>
<td>${Form.LabelFor("toDate", "To Date (yyyy/mm/dd):")}</td>
<td><input type="text" id="toDate" name="toDate" value="${?toDate}" /></td>
</tr>
<tr>
<td>${Form.LabelFor("includeZeroBalances", "Include Zero Balances:")}</td>
<td>${Form.CheckboxField("includeZeroBalances")}</td>
</tr>
<tr>
<td> </td>
<td>${Form.Submit("Download", {@class: 'submitb'})}</td>
</tr>
</table>
${Form.EndFormTag()}
Здесьстраница загрузки
<table>
<tr>
<td>Your file has been generated successfully. <a href="${downloadurl}">Click here</a> to download your file</td>
</tr>
</table>
Вы также можете добавить javascript для автоматической загрузки файла в новом окне.
document.Ready(function()
{
window.open("${downloadurl}");
});
Преимущества использования этой методологии для сохранения файлов: файлы не сохраняются насервер.Несколько меньшие накладные расходы при загрузке файлов размером более 300 КБ. Данные ответов не перезаписываются, поэтому представление будет отображаться в обычном режиме.
Недостатки использования этой методологии для сохранения файлов: недостаточно универсальны для использования налюбой браузер любой версии.Если используется для статических файлов, при изменении файла URI придется генерировать снова, поскольку содержимое файла внедрено в URI
. Надеюсь, это поможет другим, кто, похоже, застрял в той же проблеме.Я встречал подобные вопросы на нескольких форумах, где не было прямых решений.