【问题标题】:Non-invocable member 'File' cannot be used like a method while generating Reports不可调用成员“文件”在生成报告时不能像方法一样使用
【发布时间】:2016-06-26 11:40:11
【问题描述】:

我在以前的项目中使用了一种生成报告的方法,并尝试在新项目中使用相同的方法。但是,我遇到 “Non-invocable member 'File' cannot be used like a method” 错误并且无法识别文件。通过查看文件的引用,在以前的项目中似乎是FileContentResult Controller.File(),但在新项目中是System.IO.File()(即使我删除 using System.IO; 从引用行中,我遇到 "The当前上下文中不存在名称“文件”” 错误)。有解决问题的想法吗?

public static FileResult GenerateReport()
{
    EmployeeTableAdapter ta = new EmployeeTableAdapter();
    EmployeeDS ds = new EmployeeDS();

    ds.Employee.Clear();
    ds.EnforceConstraints = false;

    ta.Fill(ds.Employee);

    ReportDataSource rds = new ReportDataSource();
    rds.Name = "ReportingDataSet";
    rds.Value = ds.Employee;

    ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
    rv.ProcessingMode = ProcessingMode.Local;
    rv.LocalReport.ReportPath = System.Web.HttpContext.Current.                                 
        Server.MapPath("~/Reporting/Employee.rdlc");
    rv.LocalReport.EnableHyperlinks = true;
    rv.LocalReport.EnableExternalImages = true;

    // Add the new report datasource to the report.
    rv.LocalReport.DataSources.Add(rds);
    rv.LocalReport.EnableHyperlinks = true;
    rv.LocalReport.Refresh();

    byte[] streamBytes = null;
    string mimeType = "";
    string encoding = "";
    string filenameExtension = "";
    string[] streamids = null;
    Warning[] warnings = null;

    streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out 
        encoding, out filenameExtension, out streamids, out warnings);

    return File(streamBytes, mimeType, "Application" + "_" + ".pdf");
}


注意:我使用 MVC5 和 SQL Server。

【问题讨论】:

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


    【解决方案1】:

    System.IO.File是一个读写文件的静态帮助类,不能创建静态类的实例,所以肯定不能返回。

    您正在寻找的FileSystem.Web.MVC 命名空间中的一个方法,它返回一个FileContentResult,请参阅here on msdn

    【讨论】:

    • 谢谢,但我已经在新项目中使用了 System.Web.MVC。但唯一的区别是版本。第一个是v4.0,后者是v5.2。可能是导致此问题的原因吗?
    • @hexadecimal 刚刚注意到您没有在控制器中使用它,它是控制器的一种方法,因此它不能存在于您当前的方法中。您不能改为返回字节或内存流并在控制器中创建结果吗?
    • 实际上我想返回返回字节或内存流并在控制器中创建结果,但我没有成功。任何示例代码请通过修改我上面的代码?谢谢...
    • @hexadecimal 只需像现在一样做,并在File() 方法中使用从该方法获得的字节。另外,别忘了传递你的 mimetype
    • 我认为最好在 Controller 中而不是在另一个类中继续相同的方法。在Controller中使用这个report generate方法会不会有什么问题?
    【解决方案2】:

    您可能希望像这样将控制器的实例传递给您的方法

    在你的控制器方法中

       public async Task<IActionResult> GetFile()
       {
        ...
            return await _fileManager.GetFileAsync(this, "filename", mimeType);
        }
    

    在你的其他班级FileManager

    public async Task<FileStreamResult> GetFileAsync(ControllerBase controller, string filename, string mimeType)
        {
            ...
            return controller.File(memory, mimeType, filename);
        }
    

    【讨论】:

      【解决方案3】:

      将方法移动到 Controller 解决了这个问题。非常感谢@AlexanderDerck 的帮助。

      【讨论】:

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