【问题标题】:ASP.NET MVC 4 FileResult - In errorASP.NET MVC 4 FileResult - 出错
【发布时间】:2013-12-02 18:53:53
【问题描述】:

我在返回 PDF 的控制器上有一个简单的操作。

工作正常。

public FileResult GetReport(string id)
{
    byte[] fileBytes = _manager.GetReport(id);
    string fileName = id+ ".pdf";
    return File(fileBytes, MediaTypeNames.Application.Octet, fileName);
}

当经理未能获得报告时,我会返回null 或空的byte[]

当结果设置为 FileResult 时,我如何与浏览器交流存在问题?

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

我会将您方法的返回类型更改为 ActionResult。

public ActionResult GetReport(string id)
{
    byte[] fileBytes = _manager.GetReport(id);
    if (fileBytes != null && fileBytes.Any()){
        string fileName = id+ ".pdf";
        return File(fileBytes, MediaTypeNames.Application.Octet, fileName);
    }
    else {
        //do whatever you want here
        return RedirectToAction("GetReportError");
    }
}

【讨论】:

  • 看来我来晚了。 :D
  • 它将重定向到操作。我们如何显示错误对话框?
  • 如果你想显示一个对话框,你需要在你的页面上实现某种 AJAX 通信。
【解决方案2】:

FileResult 类继承自 ActionResult。因此,您可以像这样定义您的操作:

public ActionResult GetReport(string id)
{
    byte[] fileBytes = _manager.GetReport(id);
    string fileName = id + ".pdf";

    if(fileBytes == null || fileBytes.Length == 0)
       return View("Error");

    return File(fileBytes, MediaTypeNames.Application.Octet, fileName);
}

【讨论】:

  • 谢谢@BahaiResearch.com!
【解决方案3】:

如果您想“与浏览器通信”出现错误,标准的“HTTP 方式”是返回状态码 500,特别是如果您的请求是使用 Ajax 调用的,这样您就可以优雅地处理异常。

我建议在提供的id 找不到报告时直接抛出Exception

public FileResult GetReport(string id)
{
    // could internally throw the Exception inside 'GetReport' method
    byte[] fileBytes = _manager.GetReport(id);

    // or...
    if (fileBytes == null || !fileBytes.Any())
          throw new Exception(String.Format("No report found with id {0}", id));

    return File(fileBytes, MediaTypeNames.Application.Octet, fileName = id+ ".pdf");
}

显式重定向到错误页面或返回 ViewResult 不是 ASP.NET MVC 中的最佳方法,因为这通常是 HandleError 过滤器(默认应用)的作用,可以轻松配置为重定向或呈现一些带有异常详细信息的视图(同时仍保持 HTTP 状态 500)。

假设未能获取报告确实被视为异常,这一切都是正确的。如果不是(例如,如果我们希望某些报告没有要转储的可用文件),则显式返回 Redirect/View 结果是完全可以接受的。

【讨论】:

    【解决方案4】:

    处理先决条件的另一种解决方法是将下载过程分为两个阶段。首先是检查作为ajax/post方法执行的服务器端方法中的先决条件。

    然后,如果满足这些先决条件,您可以开始下载请求(例如,在 onSuccess 回调中检查返回值指示是否完成)在其中(在服务器端)您将以上述方式处理潜在异常帖子。

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多