FilePathResult или пользовательский результат действия? - PullRequest
0 голосов
/ 06 июля 2010

Чтобы отправить PDF-файлы (или файлы любого другого типа) в браузер, я видел примеры, в которых используется класс FileResult или пользовательский результат действия.

Есть ли преимущество использования одного над другим? Спасибо

Ответы [ 2 ]

0 голосов
/ 06 июля 2010

Они, по сути, сделали бы то же самое. Настройка FileContentResult, вероятно, является наиболее простой и простой для начала:

public FileContentResult GetPdf()
{
    return File(/* byte array contents */, "application/pdf");
}

Если вы хотите избавить себя от необходимости указывать тип содержимого (если вы всегда собираетесь делать PDF), вы можете создать ActionResult, в котором указан тип содержимого (application/pdf) внутри него, и вернуть что вместо FileContentResult (может быть что-то вроде PdfContentResult).

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

0 голосов
/ 06 июля 2010

РЕДАКТИРОВАТЬ Исходный ответ удален.

Я не уверен, что результат существующего файла позволяет вам изменить расположение содержимого, я полагаю, что это принудительно определяет расположение содержимого вложения.Если вы хотите использовать другое расположение, я бы применил пользовательский фильтр действий:

/// <summary>
/// Defines an <see cref="ActionResult" /> that allows the output of an inline file.
/// </summary>
public class InlineFileResult : FileContentResult
{
    #region Constructors
    /// <summary>
    /// Writes the binary content as an inline file.
    /// </summary>
    /// <param name="data">The data to be written to the output stream.</param>
    /// <param name="contentType">The content type of the data.</param>
    /// <param name="fileName">The filename of the inline file.</param>
    public InlineFileResult(byte[] data, string contentType, string fileName)
        : base(data, contentType)
    {
        FileDownloadName = fileName;
    }
    #endregion

    #region Methods
    /// <summary>
    /// Executes the result, by writing the contents of the file to the output stream.
    /// </summary>
    /// <param name="context">The context of the controller.</param>
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null) {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = this.ContentType;
        if (!string.IsNullOrEmpty(this.FileDownloadName)) {
            ContentDisposition disposition = new ContentDisposition();
            disposition.FileName = FileDownloadName;
            disposition.Inline = true;
            context.HttpContext.Response.AddHeader("Content-Disposition", disposition.ToString());
        }

        WriteFile(response);
    }
    #endregion
}

Это тот, который я использовал ранее, потому что я передаю фактические данные байта [] файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...