ASP.Net MVC:在浏览器中显示文件,在浏览器标签中显示文件名

问题描述:

在我的应用程序中,我有一个文件夹结构,您可以上传各种文件(jpg,png,pdf,txt等)。您可以直接下载它们作为文件或者您可以在浏览器中查看该文件。ASP.Net MVC:在浏览器中显示文件,在浏览器标签中显示文件名

要显示在浏览器中的文件,我用的是如下因素控制器动作:

public virtual ActionResult FileDisplay(int fileId, bool isFile) 
    { 
     var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile); 
     return base.File(viewmodel.Data, viewmodel.MediaType); 
    } 

该文件显示在浏览器这样的: https://i.stack.imgur.com/TXmTy.jpg

浏览器选项卡显示我的控制器的名字“ FileDisplay“和(对于这个例子)图像的尺寸。

问题: 如何在浏览器标签标题中显示文件名而不是控制器名称?这适用于所有文件类型。

1.内容Dispostion头

我发现几个职位,他们说的内容处理标头添加到与文件名的响应:

但这不起作用。

2.添加文件名,文件构造

return base.File(viewmodel.Data, viewmodel.MediaType, viewmodel.FileName); 

如果我这样做,该文件是在浏览器中显示代替下载。

3 PDF文件标题

我发现,有时候浏览器分页标题是正确的!如果我在具有文件标题(标题为pdf属性,而不是文件名)的浏览器中显示PDF文件,则浏览器标题是正确的: https://i.stack.imgur.com/orAZS.jpg

有人可以帮助我吗?

+0

尝试更改.cshtml页面中的“ViewBag.Title”。 – Nitin

+0

直接返回文件时没有.cshtml页面。 –

+0

糟糕你是对的,我没有看到它。你可以在你的控制器“ViewBag.Title”中试试这个。它可能工作。 – Nitin

解决方法现在:

我创建了一个新的动作和视图,一个全屏iframe,所以我可以设置这个容器视图的标题。 IFrame源直接调用我的文件。

public virtual ActionResult FileDisplay(string fileName, int fileId, bool isFile) 
    { 
     var viewModel = new IFrameDocumentDisplayViewModel 
     { 
      FileName = fileName, 
      FileId = fileId, 
      IsFile = isFile 
     }; 

     return PartialView("IFrameFileDisplayView", viewModel); 
    } 

    public virtual ActionResult GetFile(int fileId, bool isFile) 
    { 
     var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile); 
     return base.File(viewmodel.Data, viewmodel.MediaType); 
    } 

@model OnView.Models.ViewModels.Document.IFrameDocumentDisplayViewModel 
 

 
@{ 
 
    Layout = null; 
 
} 
 

 
<!DOCTYPE html> 
 

 
<html> 
 
<head> 
 
    <meta name="viewport" content="width=device-width" /> 
 
    <title>@Model.FileName</title> 
 
</head> 
 
<body> 
 
    <iframe style="border: 0; position:absolute; top:0; left:0; right:0; bottom:0; width:100%; height:100%" src="@Html.Raw(Url.Action("GetFile", "Document", new { fileId = Model.FileId, isFile = Model.IsFile}))"></iframe> 
 
</body> 
 
</html>

所以现在我可以设置页面标题。但我仍然很好奇,如何在没有IFrame的情况下完成它。

+1

很遗憾,这是我发现这样做的唯一方法。一般的经验法则,“如果解决方案涉及IFrame,可能不是正确的解决方案。” –

设置在头节你的标题标签到您的文件名

<tatle>Filename</title> 
+0

您有更多扩展代码示例?你能修改我的控制器动作吗? –

试试这个: -

public virtual ActionResult FileDisplay(int fileId, bool isFile) 
{ 
    var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile); 
    ViewBag.Title= viewmodel.FileName; 
    return base.File(viewmodel.Data, viewmodel.MediaType); 
} 
+0

这不工作 –

什么浏览器显示为标签标题是URL的最后一部分(该浏览器已不知道什么是你的控制器的名称),所以你可以重新格式化您的网址是这样的:

localhost/OnView.Web/Document/FileDisplay/1685/True/MyTabName 

然后标签标题将为MyTabName

但改变这种目的的整个URL模式也似乎是一个解决办法...

旁注:我有同样的问题,但我的网址是这样的:FileDisplay/3?isFile=true,我的分页标题是(在Chrome中,对于IE,标题标题是域)。