如何处理ASP.NET MVC控制器操作的不同ActionResults

时间:2009-12-15 16:15:22

标签: asp.net-mvc actionresult

我有一个不太理想的情况,即上传的文件存储在内部网络共享上。所以在数据库中我存储了保存文件的路径,但是文件很可能被删除,与数据库不同步。因此,在Controller操作中,我查找上载信息并执行检查,确定事情是正确的。它可以概括为:

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 Tabs,所以没有什么大的,但仍然是一个主要的不便)。

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

1 个答案:

答案 0 :(得分:-1)

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

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

public ContentResult GetUploadedFile(int uploadId){

一些结果类型是:

  1. ViewResult - 表示HTML和标记。
  2. EmptyResult - 表示无结果。
  3. RedirectResult - 表示重定向到新URL。
  4. JsonResult - 表示可在AJAX应用程序中使用的JavaScript Object Notation结果。
  5. JavaScriptResult - 表示JavaScript脚本。
  6. ContentResult - 表示文本结果。
  7. FileContentResult - 表示可下载的文件(包含二进制内容)。
  8. FilePathResult - 表示可下载的文件(带路径)。
  9. FileStreamResult - 表示可下载的文件(带有文件流)。
  10. List taken from here