我无法在 asp.net core 2.0 razor pages 中执行下载操作
Posted
技术标签:
【中文标题】我无法在 asp.net core 2.0 razor pages 中执行下载操作【英文标题】:I'm unable to perform download operation in asp.net core 2.0 razor pages 【发布时间】:2019-06-28 22:32:25 【问题描述】:我正在开发文档管理系统,但无法在 asp.net core 2.0 razor 页面中通过 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");
我正在尝试从数据库中下载所有文件。
所有页面都连接到数据库。
【问题讨论】:
哪里没用?您收到任何错误吗? 【参考方案1】:我不确定你到底想做什么。您的页面混合了文件上传和下载内容。
对于文件下载,我执行以下操作。在 .cshtml 页面上,我有一个按钮,该按钮将在代码隐藏页面上调用 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);
【讨论】:
以上是关于我无法在 asp.net core 2.0 razor pages 中执行下载操作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 2.0 中根据路由配置服务身份验证
asp.net core 2.0 中的 WCF - 无法为具有权限的 SSL/TLS 安全通道建立信任关系
使用 ASP NET Core 2.0 Razor 页面进行路由
如何使用 asp.net core 2.0 Razor 页面执行下载操作