0

在我的控制器中,我有一个返回 FileStreamResult 的 GenerateDocument 方法。

在我看来,我的 javascript 只是像这样打开一个新的;window.open('/controller/GenerateDocument/?id=blah');

我需要我的 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:
      }
  });

注意:上面的控制器代码可以工作。当我切换到返回 ActionResult 并取消注释它停止工作的异常处理内容时。

4

2 回答 2

3

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

public ActionResult GenerateDocument() {
     ..... // Do code
     if (errors)
         return View(errorModel);
     return new FileStreamResult(...); // your pdf file
}
于 2012-10-04T15:56:51.740 回答
2

您可以简单地使用返回 FilePathResult 的 Controller.File 方法来执行此操作。有许多重载,但这里是一个示例:

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

您不需要更改操作的返回类型,因为 FilePathResult 继承自 ActionResult,因此在出现错误的情况下您可以返回视图来处理。

于 2012-10-04T15:57:42.090 回答