我无法在 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 页面执行下载操作

具有用户权限的基于 JWT 令牌的授权 Asp.net core 2.0

如何在 ASP.NET Core 2.0 中预编译视图?