FilePathResult还是自定义操作结果?

时间:2010-07-06 15:57:57

标签: asp.net-mvc model-view-controller asp.net-mvc-2

要将pdf文件(或任何其他文件类型)发送到浏览器,我见过使用FileResult类或自定义操作结果的示例。

使用一个优于另一个有优势吗?感谢

2 个答案:

答案 0 :(得分:0)

编辑原始回复已删除。

我不确定存在的文件结果是否允许您修改内容处置,我相信它会强制“附件”的内容处理。如果你想使用不同的处置方式,我会实现一个自定义的Action Filter:

/// <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
}

这是我之前使用过的,因为我传递了文件的实际byte []数据。

答案 1 :(得分:0)

他们基本上会做同样的事情。设置FileContentResult可能是最直接且最容易上手的:

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

如果您不想指定内容类型(如果您总是要执行PDF),则可以创建指定内容类型(ActionResult)的application/pdf。它,并返回而不是FileContentResult(可能像PdfContentResult)。

但就像我说的那样,他们会做同样的事情而且不会有任何性能差异。