MVCでcsvへのエクスポートを実装しています。
パラメータは日時型であるため、ユーザーの文化が異なるため、データをポストに送信する必要があります。
サーバーコード:
[HttpPost]
public async Task<FileResult> ExportBomTotal(ReportRequestVM reportRequestVM)
{
List<MyData> result = await service.getData(reportRequestVM);
string fileName = string.Format("file{0}-{1} .csv", reportRequestVM.StartDate.ToShortDateString(), reportRequestVM.EndDate.ToShortDateString());
return new CSVResult<MyData>(result) { FileDownloadName = fileName };
}
クライアントでは、次のようにポストでデータを送信しようとしています:
$.ajax({
url: '@Url.Action("ExportBomTotal", "Analytics")',
type: 'POST',
data: JSON.stringify(searchParameters),
contentType: 'application/json',
success: function (data) {
debugger;
// window.location.assign(data);
// window.location.replace(data);
},
error: function (response) {
debugger;
},
cache: false
});
日付はサーバーに渡されます。これまでのところ問題ありませんが、ダウンロード ファイルのポップアップが表示されません。
window.location を使用する必要があると思いますが、リクエストはポスト操作である必要があります。
CSVResult をどのように求められたかについては、 public seal class CSVResult : FileResult where T : class { private readonly IEnumerable _collection;
public CSVResult(IEnumerable<T> collection)
: base("text/csv")
{
_collection = collection;
}
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (MemoryStream mstream = new MemoryStream())
{
WriteObject(mstream);
outputStream.Write(mstream.GetBuffer(), 0, (int)mstream.Length);
}
}
private void WriteObject(Stream stream)
{
// We will follow the recommandations stated in this article
// http://www.commentcamarche.net/faq/sujet-7273-exporter-a-coup-sur-du-csv
StreamWriter writer = new StreamWriter(stream, System.Text.Encoding.Default);
//modelType.
Dictionary<string, bool> dict = new Dictionary<string, bool>();
// Render columns
Type modelType = typeof(T);
PropertyInfo[] props = modelType.GetProperties();
foreach (PropertyInfo prop in props)
{
object[] attrs = prop.GetCustomAttributes(true);
foreach (VisibleAttribute visible in attrs.OfType<VisibleAttribute>())
{
dict.Add(prop.Name, visible.Hide);
}
}
List<ModelMetadata> metadatas = ModelMetadataProviders.Current.GetMetadataForProperties(null, modelType)
.Where(m => !dict.ContainsKey(m.PropertyName) || dict[m.PropertyName] )
.OrderBy(p => p.Order).ToList();
foreach (ModelMetadata t in metadatas)
{
WriteValue(writer, t.DisplayName ?? t.PropertyName);
}
writer.WriteLine();
// Render data
var en = _collection.GetEnumerator();
while (en.MoveNext())
{
ModelMetadata mprop = ModelMetadataProviders.Current.GetMetadataForType(() => en.Current, modelType);
var allowedProperties = mprop.Properties
.Where(m => !dict.ContainsKey(m.PropertyName) || dict[m.PropertyName]);
foreach (ModelMetadata prop in allowedProperties)
{
WriteValue(writer, prop.SimpleDisplayText ?? String.Empty);
}
writer.WriteLine();
}
writer.Flush();
}
/// <summary>
/// Writes the value.
/// </summary>
/// <param name="writer">The writer.</param>
/// <param name="literal">The literal.</param>
private static void WriteValue(StreamWriter writer, String literal)
{
// Enclose values in quote
writer.Write("\"");
string line = literal;//.Replace("\"", "\"\"");
writer.Write(line);
writer.Write("\",");
}
}
アドバイスをいただければ幸いです、
1o、
ロニー