如何在 Razor 页面上单击按钮下载文件?

How to download a file on button click on a Razor page?

我正在生成一个 XML 文件,其中填充了来自 Razor 页面的信息,我想通过单击下载按钮下载这个生成的 XML 文件。我是 Razor 页面的新手,返回 XML 文件作为 FileResult 对我不起作用。关于为我的 <a> 编写什么以及如何设置 C# 注释等的指导将非常有帮助。

我的 .cshtml 代码是:

<br/> 
@Html.ActionLink("Link name", "SaveFile", "EditLicense", 
        new { 
           LicenseFileJson = JsonConvert.SerializeObject(Model.License) 
        }) 
<br/> 

当它显示在页面上时,我得到:

<br/> <a href="">Link name</a><br/> 

点击它什么也没做。

我的操作代码是:

public class EditLicenseController : Controller
{
    public FileResult SaveFile(string LicenseFileJson)
    {
        License License = (License)JsonConvert.DeserializeObject(LicenseFileJson);
        LicenseTool tool = new LicenseTool(License);
        string licenseFileString = tool.ToFileString();
        byte[] bytes = Encoding.ASCII.GetBytes(licenseFileString);
        var stream = new MemoryStream();
        var writer = new StreamWriter(stream);
        writer.Write(licenseFileString);
        writer.Flush();            
        Response.Headers.Add("Content-Disposition", "attachment;");
        return File(bytes, "text/xml", "testing123.xml");
    }
    ...

当我点击 link 时,我在 chrome 开发工具的网络选项卡中也没有看到任何表明它正在工作的信息。

尝试这样做:

更改视图:

@Html.ActionLink("Link name", "SaveFile", "EditLicense", new 
{ 
   LicenseFileJson = JsonConvert.SerializeObject(Model.License) 
});

更改操作:

public FileResult SaveFile(string LicenseFileJson)
{
   License License = (License)JsonConvert.DeserializeObject(LicenseFileJson);
   LicenseTool tool = new LicenseTool(License);
   string licenseFileString = tool.ToFileString();
   //byte[] bytes = Encoding.ASCII.GetBytes(licenseFileString);
   //var stream = new MemoryStream();
   //var writer = new StreamWriter(stream);
   //writer.Write(licenseFileString);
   //writer.Flush();            
   //Response.Headers.Add("Content-Disposition", "attachment;");
   return File(System.Text.Encoding.UTF8.GetBytes(licenseFileString), "text/xml", "testing123.xml");
}

编辑:

添加示例:

查看:

@Html.ActionLink("link name", "SaveFile", "EditLicense", new
{
    LicenseFileJson = "SOME TEXT JUST TO TEST"
});

我的 link 呈现为:<a href="/EditLicense/SaveFile?LicenseFileJson=%22SOME%20TEXT%20JUST%20TO%20TEST%22">link name</a>

操作:

public FileResult SaveFile(string LicenseFileJson)
{            
   return File(System.Text.Encoding.UTF8.GetBytes(LicenseFileJson), "text/xml", "test");
}

下载成功:

href 值表示您的路由配置有问题。确保在 Startup.cs

中添加了以下行
app.UseMvcWithDefaultRoute();

或其等效物

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});