【问题标题】:Why does my page refresh instead of downloading the file in razor page?为什么我的页面刷新而不是在剃须刀页面中下载文件?
【发布时间】:2019-10-11 20:43:51
【问题描述】:

我的一个剃须刀页面中有一个表单,提交时会生成一个byte[],然后我返回一个FileStreamResult。问题是,所发生的只是页面刷新,并且没有提示我下载文件。

这是我的表格:

<form autocomplete="off" method="post" asp-page-handler="attendance" asp-route-id="@Model.Data.Id">
    <div class="form-group">
        <label class="font-weight-bold">Date of meeting</label>
        <input class="form-control datepicker" id="meeting-date" type="text" value="DateOfMeeting" />
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-primary btn-block">Download document</button>
    </div>
</form>

这是我的页面处理程序:

public async Task<IActionResult> OnPostAttendanceAsync(int id) 
{
    var query = new AttendanceList.Query {
        Date = DateOfMeeting,
        SchoolId = id
    };

    var model = await _mediator.Send(query);

    var stream = new MemoryStream(model.Data);

    return new FileStreamResult(stream, ContentType.Pdf) {
        FileDownloadName = "Attendance.pdf"
    };
}

我不明白我在这里缺少什么。

编辑:处理程序被成功调用。如果我在其中设置断点并进行调试,则处理程序成功完成,但没有文件发送到浏览器。

【问题讨论】:

  • 也许标签助手没有被导入。浏览器开发工具中表单的 URL 是什么样的?
  • @KirkLarkin 这是表单的 URL:action="/Schools/Details/44?handler=attendance"。如果我调试,则处理程序被正确调用并且它到达断点并且方法完成而没有任何异常。
  • FWIW,当内存中已经有一个 byte[] 时,返回流是没有意义的。您所做的只是将内存使用量增加一倍。只需直接返回FileResultbyte[]
  • 您需要返回 FileContentResult。

标签: asp.net-core razor-pages


【解决方案1】:

好的,问题在于使用POST 而不是GET 作为表单方法。

我已将代码更新为以下内容,现在出现下载提示,一切正常:

<form autocomplete="off" method="get" asp-route-id="@Model.Data.Id">
    <input type="hidden" name="handler" value="attendance" />
    <div class="form-group">
        <label class="font-weight-bold">Date of meeting</label>
        <input class="form-control datepicker" type="text" name="dateOfMeeting" />
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-primary btn-block">Download document</button>
    </div>
</form>

处理程序签名现在是:

public async Task<IActionResult> OnGetAttendanceAsync(int id, string dateOfMeeting)

【讨论】:

  • 对我来说,它也适用于发布请求,但我返回的是 File() 而不是 FileStreamResult()
猜你喜欢
  • 2021-12-18
  • 2018-09-18
  • 1970-01-01
  • 2021-04-25
  • 2020-01-12
  • 2020-11-11
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多