हालाँकि मानक क्रिया परिणाम FileContentResult या FileStreamResult का उपयोग फ़ाइलों को डाउनलोड करने, पुन: प्रयोज्य के लिए किया जा सकता है, एक कस्टम क्रिया परिणाम बनाना सबसे अच्छा समाधान हो सकता है।
एक उदाहरण के रूप में आइए डाउनलोड के लिए मक्खी पर एक्सेल फ़ाइलों को डेटा निर्यात करने के लिए एक कस्टम एक्शन परिणाम बनाते हैं।
ExcelResult वर्ग अमूर्त ActionResult वर्ग वारिस करता है और ExecuteResult विधि को ओवरराइड करता है।
हम डेटाटेबल से एक्सेल फाइल बनाने के लिए IEnumerable ऑब्जेक्ट से डेटाटैब बनाने के लिए FastMember पैकेज और ClosedXML पैकेज का उपयोग कर रहे हैं।
public class ExcelResult<T> : ActionResult
{
private DataTable dataTable;
private string fileName;
public ExcelResult(IEnumerable<T> data, string filename, string[] columns)
{
this.dataTable = new DataTable();
using (var reader = ObjectReader.Create(data, columns))
{
dataTable.Load(reader);
}
this.fileName = filename;
}
public override void ExecuteResult(ControllerContext context)
{
if (context != null)
{
var response = context.HttpContext.Response;
response.Clear();
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("content-disposition", string.Format(@"attachment;filename=""{0}""", fileName));
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dataTable, "Sheet1");
using (MemoryStream stream = new MemoryStream())
{
wb.SaveAs(stream);
response.BinaryWrite(stream.ToArray());
}
}
}
}
}
नियंत्रक में कस्टम ExcelResult कार्रवाई परिणाम निम्नानुसार उपयोग करें
[HttpGet]
public async Task<ExcelResult<MyViewModel>> ExportToExcel()
{
var model = new Models.MyDataModel();
var items = await model.GetItems();
string[] columns = new string[] { "Column1", "Column2", "Column3" };
string filename = "mydata.xlsx";
return new ExcelResult<MyViewModel>(items, filename, columns);
}
चूंकि हम HttpGet का उपयोग करके फ़ाइल डाउनलोड कर रहे हैं, इसलिए बिना मॉडल और खाली लेआउट के एक खाली दृश्य बनाएं।
मक्खी पर बनाई गई फ़ाइलों को डाउनलोड करने के लिए कस्टम एक्शन परिणाम के बारे में ब्लॉग पोस्ट:
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html