【问题标题】:Razor page For loop on form to execute method in modelRazor 页面 For 循环在表单上执行模型中的方法
【发布时间】:2019-08-11 16:19:26
【问题描述】:

我有一个简单的 Razor 页面,我试图显示一个按钮,单击该按钮将在后面的页面模型代码中执行一个方法,类似于 C# 的 WPF 按钮。我根本不想使用任何 javascript。

我已经达到了某种程度,它有点像我想要的那样,但是在页面加载时,它会为每个列表中的每个元素执行该方法。这是我不想要的,我只想在按下按钮时执行该方法。

带有for循环的剃须刀页面代码如下:

    @foreach (var item in @Model.UserData)
{

    <tr>
        <td>@item.Owner</td>
        <td>@item.InputPath</td>
        <td>@item.OutputPath</td>
        <td>@item.Status</td>
        <td>
            <form asp-action="@Model.DownloadCsv(@item.OutputPath)" method="post">
                <button>Download</button>
            </form>
        </td>

    </tr>
    <tr>
        <td colspan="5"> <hr /> </td>
    </tr>
}

在后面的代码中,我现在只有这个:

        public IActionResult DownloadCsv(string inputPath)
    {
        int i = 0;
        return Page();
    }

【问题讨论】:

  • 剃须刀不是这样工作的。您对客户端和服务器端的担忧感到困惑。
  • 那么正确的做法是什么?我对 asp.net 完全陌生。
  • 我注意到它在 url 中附加了方法名称,有没有办法防止这种情况发生?如果您刷新页面,它会很烦人。
  • 是的,确实如此,解决方案是阅读文档(Nkosi 提供的链接)。他们非常清楚应该如何进行设置。

标签: asp.net-core razor


【解决方案1】:

您可以使用asp-page-handler 选择处理程序,asp-route-{attribute} 传递参数。使用return File() 下载文件而不刷新页面。

页面:

@page 
...
<td>
    <form method="post">
        <button type="submit" asp-page-handler="DownloadCsv" asp-route-inputPath="@item.OutputPath"
                class="btn btn-success">
            Download
        </button>
    </form>
</td>

页面模型:

public ActionResult OnPostDownloadCsvAsync(string inputPath)
    {
       //other logic
        return File("path\to\file", "application/octet-stream",
                    "DownloadFileName.csv");
    }

参考

Download file to browser using .NET Core Razor Pages

Return PDF to the Browser using Asp.net core

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2019-02-08
    • 2014-07-22
    • 2022-01-24
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多