在我的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并取消注释它停止工作的异常处理时。
答案 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继承时,您不需要更改操作的返回类型,因此如果出现错误,您可以返回视图来处理此操作。