如何从方法

时间:2016-05-24 08:22:42

标签: c# asp.net-mvc file

是否可以将File对象从方法返回到controller

目前所有逻辑都是在控制器中完成的,所以我得到了这个:

public ActionResult Download(Guid id){
    //some code to get file name, file stream and file content
    return File(fileStream, file.ContentType, file.Name);
}

但我想在控制器中得到的是:

//this is in the controller
public ActionResult Download(Guid id){
    var file = GetFile(fileId);
    return file;
}

此方法包含有关文件本身的所有信息应该在服务层中:

//this is NOT in the controller
public File GetFile(Guid fileId){
    //some logic to get all stuff

    return File(fileStream, attachment.ContentType, attachment.Name);
}

但是,我这个案子得到消息

  

"不可访问的成员'文件'不能像方法那样使用。"

我可以实现这个目标,还是应该忘记这一点并坚持我现在拥有的东西?

编辑:建议的问题不回答我的问题!

我可以下载文件,但我希望在我的控制器中有一个返回File类型或其他类型的方法,这个方法应该在服务层的另一个项目中。所以这个方法应该将文件作为object()返回,而不是流,而不是文件名或类型。在控制器中,我只调用此方法并仅返回此方法返回的内容。

2 个答案:

答案 0 :(得分:3)

服务层中的

GetFile可以返回包含以下内容的自定义类型:

  • 字节[]
  • 的ContentType
  • 文件名

服务层中的类型:

public class CustomFile
{
     public byte[] FileContents { get; set; }
     public string ContentType { get; set; }
     public string FileName { get; set; }
}

服务中的GetFile方法:

public CustomFile GetFile(Guid fileId)
{
   // some logic to get all stuff
   // set CustomFile here
   // return CustomFile
}

在控制器中(假设您已正确注入服务):

public ActionResult Download(Guid id)
{
   var file = IYourService.GetFile(fileId);
   return File(file.FileContents, file.ContentType, file.FileName);
}

修改:自定义类型可以由System.Web.Mvc.FileContentResult替换(我不知道它是否可以测试)。所以,GetFile看起来:

public FileContentResult GetFile(Guid fileId)
{
  // some logic to get all stuff
  // return new FileContentResult(FileContents, "MIMEType")
  // {
  //    FileDownloadName = "FileName"
  // }; 
}

Controller动作方法:

public FileContentResult Download(Guid id)
{
     var file = IYourService.GetFile(fileId);
     return file;
}

答案 1 :(得分:0)

因为您尝试使用的文件类是System.IO的一部分,您需要控制器。

https://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx

enter image description here

你所拥有的是

enter image description here

您可以执行以下操作,可能值得查看您的代码。

public FileContentResult GetFile(Guid fileId) 
{
    //some logic to get all stuff
    return File(fileStream, attachment.ContentType, attachment.Name);
}