2016-11-14 8 views
1

В моем приложении у меня есть структура папок, где вы можете загружать все виды файлов (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 "и (для этого примера) размеры изображения.

Вопрос: Как отобразить имя файла в заголовке вкладки brower вместо имени контроллера? Это для всех типов файлов.

1. Content-Dispostion заголовок

Я нашел несколько постов, где они говорят, чтобы добавить заголовок Content-Disposition в ответ с именем файла:

Но это не сработает.

2. Добавьте имя файла конструктору File

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

Если я это сделаю, то файл будет загружен вместо отображаемых в браузере.

3. PDF название файла

Я обнаружил, что иногда название вкладки браузера правильно! Если я отображаю PDF-файл в браузере, который имеет название файла (название в свойствах pdf, а не имя файла), верно название браузера: https://i.stack.imgur.com/orAZS.jpg

Может кто-нибудь мне помочь?

+0

Попробуйте изменить «ViewBag.Title» на странице .cshtml. – Nitin

+0

При возврате файла напрямую нет .cshtml-страницы. –

+0

К сожалению, вы правы, я этого не видел. Вы можете попробовать это в своем контроллере «ViewBag.Title». Это может сработать. – Nitin

ответ

1

Обход сейчас:

Я создал новое действие и вид с полноэкранный 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, это, вероятно, не правильное решение». –

-2

установить тег заголовка в головной секции для вашего имени файла

<tatle>Filename</title> 
+0

У вас есть более расширенный пример кода? Можете ли вы изменить действие моего контроллера? –

-1

Попробуйте: -

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

Это не работает –

0

Что дисплей браузера в качестве заголовка вкладки является последней частью URL (браузер не имеет представления о том, что это ваше имя контроллера), так что вы можете переформатировать свой адрес, как это:

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

Тогда tab заголовок будет MyTabName.

Но изменения всей схемы URL для этой цели также выглядит как обходной путь ...

Sidenote: У меня такая же проблема, но мой URL выглядит так: FileDisplay/3?isFile=true и моя закладка название (в chrome. Для IE заголовок табуляции является доменом).