0

我有一个不太理想的情况,上传的文件存储在内部网络共享中。因此,在数据库中,我存储了保存文件的路径,但是文件很可能会在数据库不同步的情况下被删除。因此,在控制器操作中,我查找上传信息并检查事情是否正确。可以总结为这样的事情:

public ActionResult GetUploadedFile(int uploadId){
    var uploadedFile = Repository<Upload>.FirstOrDefault(upload => upload.ID == uploadID);
    if(uploadedFile == default(Upload)){
        return View("InvalidUpload");
    }
    if(File.Exists(uploadFile.Path)){
        var fileInfo = new FileInfo(uploadFile.Path);
        var contentType = HttpContext.GetMimeTypeForFileInfo(fileInfo) // my lookup extension method
        return File(uploadFile.Path, contentType, uploadFile.Name);
    }
    return View("InvalidUpload");
}

问题是当前可以通过 AJAX 加载的视图上的链接访问此操作。因此,当文件确实存在并且一切正常时,它会在浏览器中弹出标准的“你想用这个文件做什么”对话框,并保持内容对用户可见。问题是通过代码的其他路径。返回视图会将用户带到一个全新的 URL。然后单击返回将重置它们的位置(它基本上是动态的 jQuery 选项卡,所以没什么大不了的,但仍然是一个主要的不便)。

所以我正在寻找其他人可能如何解决这种情况,因为这似乎并不罕见。或者甚至是一些反馈,以使其更加用户友好。我对文件的存储位置没有发言权,因此更改它不是一种选择。

4

1 回答 1

-1

您可以使用不同类型的操作结果。

通常,当我有一个输出视图以外的其他内容的控制器方法时,我会使用 ContentResult 操作。

public ContentResult GetUploadedFile(int uploadId){

一些结果类型是:

  1. ViewResult – 表示 HTML 和标记。
  2. EmptyResult – 表示没有结果。
  3. RedirectResult – 表示重定向到新 URL。
  4. JsonResult – 表示可以在 AJAX 应用程序中使用的 JavaScript 对象表示法结果。
  5. JavaScriptResult – 表示 JavaScript 脚本。
  6. ContentResult – 表示文本结果。
  7. FileContentResult – 表示可下载文件(带有二进制内容)。
  8. FilePathResult – 表示可下载文件(带有路径)。
  9. FileStreamResult – 表示可下载文件(带有文件流)。

列表取自这里

于 2009-12-15T16:51:50.733 回答