C# ASP.NET MVC 4文件结果错误

C# ASP.NET MVC 4文件结果错误,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我在控制器上有一个简单的操作,它返回一个PDF 很好 public FileResult GetReport(string id) { byte[] fileBytes = _manager.GetReport(id); string fileName = id+ ".pdf"; return File(fileBytes, MediaTypeNames.Application.Octet, fileName); } 当经理无法获取报告时,我会返回null或一个空的字节

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

很好

public FileResult GetReport(string id)
{
    byte[] fileBytes = _manager.GetReport(id);
    string fileName = id+ ".pdf";
    return File(fileBytes, MediaTypeNames.Application.Octet, fileName);
}
当经理无法获取报告时,我会返回
null
或一个空的
字节[]


当结果设置为
FileResult
时,我如何与浏览器沟通是否存在问题?

我会将方法的返回类型更改为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");
    }
}

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);
}
如果您想“向浏览器传达”发生了错误,标准的“HTTP方式”是返回状态代码500,特别是如果您的请求是使用Ajax调用的,这样您就可以优雅地处理异常

我建议在没有为提供的
id
找到报告时,简单地抛出一个
异常

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)


假设无法获取报告确实被视为异常,则所有这些都是正确的。如果不是(例如,如果我们预期某个报告没有可用的文件可转储),显式返回重定向/查看结果是完全可以接受的。

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


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

看来我已经太迟了。:DIt将重定向到操作。我们如何显示错误对话框?如果您想显示对话框,您需要在页面上实现某种AJAX通信。谢谢,@BahaiResearch.com!可能与