Любая помощь с этим будет высоко ценится. У меня есть сетка данных и кнопка загрузки в моем интерфейсе. Когда пользователь выбирает строку в сетке и нажимает кнопку загрузки, он должен передать int id в качестве параметра моему методу загрузки на моем контроллере, который обрабатывает загрузку.
Я использовал Ajax / JQuery для этого, к чему я новичок. После отладки выясняется, что он отправляет два запроса GET, один с моим правильным идентификатором, а другой без, что приводит к сохранению пустого файла при загрузке. Если я набираю полный URL с идентификатором в браузере, он загружается правильно, и мой метод загрузки также работает в моем модульном тестировании, поэтому я думаю, что что-то не так в Ajax / JQuery.
Пожалуйста, смотрите соответствующий код ниже:
// html
<form asp-controller="Home" asp-action="Download" method="get">
<div id="downloadButton"></div>
</form>
// JQuery сетка данных в моем представлении, которая вызывает метод getLoadId, когда пользователь выбирает строка данных:
$("#gridContainer2").dxDataGrid({
dataSource: DevExpress.data.AspNet.createStore({
loadUrl: url + "/GetLoadHistory",
key: "loadId"
}),
selection: {
mode: "single"
},
hoverStateEnabled: true,
paging: {
pageSize: 10
},
editing: {
mode: 'row',
},
onSelectionChanged: getLoadId
});
// JQuery работает с Ajax, который передает выбранный loadId в контроллер:
function getLoadId() {
var dataGrid = $("#gridContainer2").dxDataGrid("instance");
var loadIds = dataGrid.getSelectedRowKeys();
var loadId = loadIds[0];
if (loadId > 0)
{
console.log("Load ID: " + loadId);
download(loadId);
}
}
function download(loadId) {
$("#downloadButton").dxButton({
text: "Download Selected",
type: "default",
icon: "/favicon.ico",
contentType: "application/json; charset=utf-8",
dataType: "json",
useSubmitBehavior: true,
onClick: function(e) {
$.ajax({
url: 'https://localhost:44346/home/Download/',
type: 'GET',
data: {
loadId: loadId
}
}).done(function() {
DevExpress.ui.notify("Downloading results for Load ID: " + loadId, "info", 1500);
});
}
});
console.log("Load ID: " + loadId + " download processed");
};
// методы загрузки на домашний контроллер:
[HttpGet]
public async Task<IActionResult> Download(int loadId)
{
Console.WriteLine("Attempting to download Load ID: " + loadId + " from UI");
var outputFolder = Directory.GetCurrentDirectory() + "\\wwwroot\\output\\";
var name = GetFileName(loadId, outputFolder);
var path = Path.Combine(outputFolder, name);
var memory = new MemoryStream();
try
{
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
}
catch (Exception e)
{
Log.Error($"Unable to copy load {loadId} to memory for download: " + e);
}
Log.Info($"Results for file load: " + loadId + " download triggered successfully");
return File(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Downloaded.xlsx");
}
public string GetFileName(int loadId, string outputFolder)
{
Log.Info($"Locating results for load {loadId} on web server");
var resultsName = @"Results_Load_" + loadId + "_*";
var results = "";
var d = new DirectoryInfo(outputFolder);
try
{
foreach (var file in d.GetFiles(resultsName))
{
Log.Info($"Results for load {loadId} located for download");
results = file.Name;
}
}
catch (Exception e)
{
Log.Error($"Results for load {loadId} not found on server: " + e);
return null;
}
return results;
}