我无法在 asp.net 核心 2.0 剃须刀片页面中执行下载操作



我正在开发文档管理系统,但无法通过asp.net核心2.0剃刀页面中的SQL数据库执行下载操作,以下是关于我的项目的更多详细信息。

索引.cshtml

@page
@model IndexModel
@{
ViewData["Title"] = "Schedules";
}
<div style="background-color:aliceblue;">
<hr />
<div class="well well-sm " style="background-color:lightskyblue;height:50px;"><h3 style="text-align:center;color:white;font-weight:bold;margin-top:0px;"> +Add Files</h3></div>
<div class="row">
<div class="col-md-4">
<form method="post" enctype="multipart/form-data">
<div class="form-group">
<label asp-for="FileUpload.Title" class="control-label"></label>
<input asp-for="FileUpload.Title" type="text" class="form-control" />
<span asp-validation-for="FileUpload.Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FileUpload.UploadPublicSchedule" class="control-label"></label>
<input asp-for="FileUpload.UploadPublicSchedule" type="file" class="form-control                        btn btn-primary btn-sm float-left" style="height:auto" />
<span asp-validation-for="FileUpload.UploadPublicSchedule" class="text-                     danger"></span>
</div>
<input type="submit" value="Upload" class="btn btn-primary" />
</form>
</div>
</div>
<hr />
<h3>Loaded Schedules</h3>
<table class="table " style="background-color:lightskyblue;">
<thead style="font-weight:bold ;color:white;background-color:black;margin-right:-50px;padding-right:80px;">
<tr style="background-color:darkblue;color:white;">

<th>
@Html.DisplayNameFor(model => model.Schedule[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Schedule[0].UploadDT)
</th>
<th>
@Html.DisplayNameFor(model => model.Schedule[0].PublicScheduleSize)
</th>
@*<th class="text-center">
@Html.DisplayNameFor(model => model.Schedule[0].PrivateScheduleSize)
</th>*@
<th class="text-center">Operations</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Schedule)
{
<tr style="font-weight:bold">
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.UploadDT)
</td>
<td>
@Html.DisplayFor(modelItem => item.PublicScheduleSize)
</td>
<td style="margin-left:-60px;">
@*<a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>*@
<a asp-page="./Delete" asp-route-id="@item.ID" class="btn btn-danger glyphicon glyphicon-trash" role="button">Delete</a>
</td>
<td>
<a asp-page-handler="karuna.txt" role="button"
download>
download the license
</a>
</td>
</tr>
}
</tbody>
</table>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<script>
function createPDFLink(fileName) {
var doc = new pdf();
// whatever content you want to download
var a = document.createElement("a");
a.download = fileName;
a.title = "download as PDF";
a.href = doc.output('datauri', { "fileName": name });
return a;
}
// some paragraph in the page
document.querySelector(
"p.saveaspdf"
).appendChild(createPDFLink(
"document-" + document.title + ".pdf"
));
</script>

这是页面模型:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using DMS.Models;
using DMS.Utilites;
using System.IO;
using System.Runtime.InteropServices.ComTypes;
namespace DMS.Pages.Schedules
{
public class IndexModel : PageModel
{
private readonly DMS.Models.DatabaseContext _context;
public IndexModel(DMS.Models.DatabaseContext context)
{
_context = context;
}
[BindProperty]
public FileUpload FileUpload { get; set; }
public IList<Schedule> Schedule { get; private set; }
public async Task OnGetAsync()
{
Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
return Page();
}
var publicScheduleData =
await FileHelpers.ProcessFormFile(FileUpload.UploadPublicSchedule, ModelState);
if (!ModelState.IsValid)
{
Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
return Page();
}
var schedule = new Schedule()
{
PublicSchedule = publicScheduleData,
PublicScheduleSize = FileUpload.UploadPublicSchedule.Length,
Title = FileUpload.Title,
UploadDT = DateTime.UtcNow
};
_context.Schedule.Add(schedule);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
}
  • 我正在尝试从数据库下载所有文件
  • 所有页面都已连接到数据库

我不确定你到底想做什么。你的页面混合了文件上传和下载功能。

对于文件下载,我会执行以下操作。在.cs.html页面上,我有一个按钮,它将调用代码隐藏页面上的Post处理程序。类似:

<button id='@("download"+item.ID)' asp-page-handler="DownloadFile" 
asp-route-externalId="@item.ExternalId" 
class="btn btn-primary">Download Report
</button>

然后在后面的代码中,我有一个处理程序,在我从数据库加载报告时,它会获取所有文件的zip文件,然后将其返回到触发下载的浏览器。重要的部分是从处理程序返回PhysicalFile以及磁盘上文件的路径。

/// <summary>
/// Return the zip file for the requested id.
/// </summary>
/// <param name="externalId">Report external id</param>
public async Task<IActionResult> OnPostDownloadFileAsync(string externalId) {
var report = LoadReport();
if (report == null) {
return Page();
}
var zipFile = report.GetReportDownload();
string filename = FileUtils.WebSafeFileName(zipFile, ".zip");
return PhysicalFile(zipFile, "application/zip", filename);
}

最新更新