使用Razor页面时,如何使用RedirectToPage传输IFormFile的内容?

时间:2019-07-16 16:16:38

标签: asp.net-core

在这种情况下,我有一个“索引”剃刀页面,要求用户输入IFormFile。用户单击,然后选择要上传的文件。

在OnPostAsync方法中,我读取了这个大文本文件(200K +),并希望将结果发送到下一个Razor页面进行处理。

return RedirectToPage("ConsolidationReport", new {fileContents});

但这只是给我们一个尺寸限制错误

  

HTTP错误502.3-错误的网关内部响应标头的大小限制   被超过

尝试重定向IFormFile也不起作用。

return RedirectToPage("ConsolidationReport", new { report = Input.InquiriesReport });

没有错误,但是接收的OnGet为空。

如果我在重定向之前处理数据并生成输出,我会得到

  

HTTP错误404.15-找不到请求过滤模块是   配置为拒绝查询字符串太长的请求。

那么,什么是正确的方法呢?我正在寻找最佳实践指导。

我应该读取文件,然后创建一个新的IFormFile并发送到我的目标页面吗?我是否应该提高所有请求的限制? 存放在临时存储区中吗?

谢谢大家!

1 个答案:

答案 0 :(得分:0)

感谢LGSon向我展示了树木!

ConsolidationModel.cs

public class ConsolidationModel
{
    [DataType(DataType.Date)]
    public DateTime StartDate { get; set; }

    [DataType(DataType.Date)]
    public DateTime EndDate { get; set; }

    [DataType(DataType.Upload)]
    public IFormFile InquiriesReport { get; set; }
}

询问报告参数的页面非常简单。

Index.cshtml.cs

public class PaymentReportPageModel : ReportPageModel
{
    [BindProperty]
    public ConsolidationModel Input { get; set; }
}

此处的窍门是通过指定asp-page =“ Report”使用目标页面 Index.cshtml

    <form method="post" class="form-horizontal" enctype="multipart/form-data">

            ** get start/end dates **

            <div class="form-group">
                <div class="col-md-3">
                    <label asp-for="Input.ReportFile" class="control-label"></label>:
                </div>
                <div class="col-md-9">
                    <input asp-for="Input.ReportFile" type="file" class="form-control" style="height: auto"/>
                </div>
            </div>

        </div>

        <div asp-validation-summary="All" class="text-danger"></div>

        <button asp-page="Report" type="submit" class="btn btn-primary">
            Execute
        </button>
    </form>

并使用第二个BindProperty接收数据! Report.cshtml.cs

public class ConsolidationPageModel : ReportPageModel
{
    [BindProperty]
    public ConsolidationModel Input { get; set; }

    public IActionResult OnPost()
    {
       // Use the data properly.
    }