Предыдущие ответы верны: добавление строки ...
Response.AddHeader("Content-Disposition", "inline; filename=[filename]");
... приведет к отправке нескольких заголовков Content-Disposition в браузер. Это происходит, поскольку b / c FileContentResult
внутренне применяет заголовок, если вы предоставляете ему имя файла. Альтернативное и довольно простое решение - просто создать подкласс FileContentResult
и переопределить его ExecuteResult()
метод. Вот пример, который создает экземпляр класса System.Net.Mime.ContentDisposition
(тот же объект, который используется во внутренней реализации FileContentResult
) и передает его в новый класс:
public class FileContentResultWithContentDisposition : FileContentResult
{
private const string ContentDispositionHeaderName = "Content-Disposition";
public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
: base(fileContents, contentType)
{
// check for null or invalid ctor arguments
ContentDisposition = contentDisposition;
}
public ContentDisposition ContentDisposition { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
// check for null or invalid method argument
ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName;
var response = context.HttpContext.Response;
response.ContentType = ContentType;
response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString());
WriteFile(response);
}
}
В вашем Controller
или в базе Controller
вы можете написать простого помощника для создания экземпляра FileContentResultWithContentDisposition
и затем вызвать его из вашего метода действия, например:
protected virtual FileContentResult File(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
{
var result = new FileContentResultWithContentDisposition(fileContents, contentType, contentDisposition);
return result;
}
public ActionResult Report()
{
// get a reference to your document or file
// in this example the report exposes properties for
// the byte[] data and content-type of the document
var report = ...
return File(report.Data, report.ContentType, new ContentDisposition {
Inline = true,
FileName = report.FileName
});
}
Теперь файл будет отправлен в браузер с выбранным вами именем файла и заголовком расположения содержимого «inline; filename = [имя файла]».
Надеюсь, это поможет!