如何从MVC中的View返回FileStreamResult

时间:2012-10-04 15:52:00

标签: asp.net-mvc-3

在我的Controller中,我有一个GenerateDocument方法,它返回一个FileStreamResult。

在我看来,我有javascript只是打开一个新的像这样; window.open( '/控制器/ GenerateDocument / ID =等等?');

我需要我的GenerateDocument方法: 1.在无错误地创建/获取文档时返回pdf, 2.出现错误时返回新的页面/视图。

这是控制器代码:

    public FileStreamResult GenerateDocument(int id)
    {
        string errorResult = string.Empty;

        try
        {
            DocumentDetail documentDetail =
                 DocumentGenerator.GenerateAgreements(id, DcmDocumentEntityType.Sponsor, GetAuthUser());

            if (documentDetail == null) return null;

            Stream stream = DocumentGenerator.RetrieveFile(documentDetail);

            return new FileStreamResult(stream, "application/pdf");
        }
        catch (Exception ex)
        {
            errorResult = FormatException(ex);
            Trace.TraceError(errorResult);
        }

        //ViewBag.Error = HttpUtility.HtmlEncode(errorResult).Replace("\n", "<br />");

        //return View("DocGenerationError");
        return null;
    }

我尝试使用ActionResult并在出现错误时返回视图,但正如我在该帖子的评论中所指出的那样,在页面javascript中,window.open(url)无法正常工作。

这是视图代码:

  $('#ActionMenu').change(function() {
      var action = $(this).val();

      switch (action) {            
      case 'Generate Sponsor Agreement':
          window.open('/Sponsor/GenerateDocument/?id=@(Model.SponsorID)');
          break;

      other cases

      default:
      }
  });

注意:上面的Controller代码是WORKS。当我切换到返回ActionResult并取消注释它停止工作的异常处理时。

2 个答案:

答案 0 :(得分:3)

我不确定我理解你的问题。这样做有什么问题?

public ActionResult GenerateDocument() {
     ..... // Do code
     if (errors)
         return View(errorModel);
     return new FileStreamResult(...); // your pdf file
}

答案 1 :(得分:1)

您可以使用Controller.File方法执行此操作,该方法返回FilePathResult。有许多重载,但这是一个例子:

return File(streamreader.ReadToEnd(), "text/plain", "Result.PDF");

当FilePathResult从ActionResult继承时,您不需要更改操作的返回类型,因此如果出现错误,您可以返回视图来处理此操作。