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

时间:2019-03-15 18:56:16

标签: c# asp.net-mvc asp.net-core razor-pages

我正在生成一个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");
    }
    ...

当我单击链接时,我也没有在chrome dev工具的“网络”标签中看到任何表明它正在工作的

2 个答案:

答案 0 :(得分:0)

尝试这样做:

更改视图:

@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"
});

我的链接呈现为:<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");
}

下载成功:

enter image description here

答案 1 :(得分:0)

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

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

或等价物

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