c# - 操作名称显示在浏览器的 PDF 工具栏中。设置ContentDisposition不会影响它

标签 c# asp.net asp.net-mvc pdf

Controller 代码:

[HttpGet]
public FileStreamResult GETPDF(string guid)
{
  var stream = XeroHelper.GetXeroPdf(guid).Result;
  stream.Position = 0;
  var cd = new ContentDisposition
  {
     FileName = $"{guid}.pdf",
     Inline = true
  };

  Response.AppendHeader("Content-Disposition", cd.ToString());
  return File(stream, "application/pdf");
}

如您所见,该方法的名称是 GETPDF。你还可以看到我正在ContentDisposition头中配置文件名的名称。如果您看到下面的内容,您将看到方法名称用作工具栏中的标题,而不是文件名。

enter image description here

文件名确实会永久保留。当我单击“下载”时,文件名是文件选择器中使用的默认值(请注意,我更改了名称以隐藏敏感 GUID):

enter image description here

如果有人有任何想法如何重命名该工具栏的标题,我们将不胜感激。

顺便说一句,这不是以下内容的重复项: C# MVC: Chrome using the action name to set inline PDF title因为没有答案被接受,并且唯一获得赞成票的答案已在我上面的方法中实现,但仍然不起作用。

编辑 - 澄清一下,我不想在新选项卡中打开 PDF。我想将其显示在我页面的查看器中。我提供的代码已经发生了这种行为,这只是标题错误并且来 self 的 Controller 方法名称。使用 Controller 代码,然后我将其显示在 View 中,如下所示:

<h1>Quote</h1>
<object data="@Url.Action("GETPDF", new { guid = @Model.QuoteGuid })" type="application/pdf" width="800" height="650"></object>

最佳答案

尝试这样的事情:

    [HttpGet]
    public FileResult GETPDF(string guid)
    {
      var stream = XeroHelper.GetXeroPdf(guid).Result;

      using (MemoryStream ms = new MemoryStream())
      {
        stream.CopyTo(ms);

        // Download
        //return File(ms.ToArray(), "application/pdf", $"{guid}.pdf");

        // Open **(use window.open in JS)**
        return File(ms.ToArray(), "application/pdf")
      }           
   }

更新:基于查看者的提及。

要嵌入页面,您可以尝试 <embed>标签或 <object>标签

这是一个例子 Recommended way to embed PDF in HTML?

即:

<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=[YOUR ACTION]" width="500" height="375">

可能需要尝试使用第三个参数的 File 方法来查看哪个有效。 如果在文件名中设置了标题,则可能会显示为标题。 (虽然不确定下载会做什么,也许可以设置一个带有 pdf 名称的下载链接)

更新2: 另一个想法:

你如何调用该网址?

您是否指定:GETPDF?guid=XXXX

也许可以尝试:GETPDF/XXXX (您可能需要为此调整路由,或者如果这是默认值,则调用参数“id”)

关于c# - 操作名称显示在浏览器的 PDF 工具栏中。设置ContentDisposition不会影响它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60535944/

相关文章:

c# - IClientValidatable 实现是否违反了 MVC 中的 DRY 原则?

c# - 为什么我在使用静态字段中的表达式时会收到 InvalidCastException?

c# - 将字符串转换为字节数组,反之亦然

c# - 如何在单击 gridview 行时调用函数。这两个函数都放在 aspx 页面的脚本标签中

css - asp.net mvc View css 未按预期显示

javascript - SignalR 抛出 JavaScript 错误

c# - Moq伪造一种方法但使用另一种方法的真实实现

c# - 带有 MySql 的 BackgroundWorker 无法正常工作

mysql - 复选框列表选择的项目未获得选择并在字符串中插入空白值

javascript - 为子页面中的控件分配值