ASP.Net MVC: отображать файл в браузере, отображать имя файла на вкладке браузера

В моем приложении у меня есть структура папок, в которую вы можете загружать все виды файлов (jpg, png, pdf, txt и т. д.). Вы можете загрузить их напрямую в виде файла или просмотреть файл в браузере.

Чтобы отобразить файл в браузере, я использую следующее действие контроллера:

    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. Заголовок Content-Dispostion

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

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

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

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

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

<сильный>3. Название файла PDF

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

Может кто-то помочь мне с этим?


person Jim Craane    schedule 14.11.2016    source источник
comment
Попробуйте изменить ViewBag.Title на странице .cshtml.   -  person Nitin    schedule 14.11.2016
comment
При непосредственном возврате файла страница .cshtml отсутствует.   -  person Jim Craane    schedule 14.11.2016
comment
Ой, вы правы, я не видел. Вы можете попробовать это в своем контроллере ViewBag.Title. Это может сработать.   -  person Nitin    schedule 14.11.2016


Ответы (3)


Обходной путь на данный момент:

Я создал новое действие и представление с полноэкранным 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.

person Jim Craane    schedule 14.11.2016
comment
Печально, что это единственный способ, который я нашел для этого. Общее эмпирическое правило: если решение включает в себя IFrame, это, вероятно, не правильное решение. - person Rob S.; 31.03.2017

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

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

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

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

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

person Kraz    schedule 05.01.2018

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

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);
}
person Nitin    schedule 14.11.2016