2012-05-09 36 views
0

我使用MVC上传一些文件。下面的代码工作正常,但我想是 从服务器返回一些信息(例如消息或ID)。 我想要做的事情很简单,但我担心我不会说清楚。 任何人都可以帮忙吗?MVC上传与回发(或者也许它被称为回调)

VIEW

@using (Html.BeginForm("AddFileX", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
     <input type="file" name="files" multiple="true" /> 
     <input id="submit" type="submit" value="Upload" /> 
    } 

控制器

[HttpPost] 
    public ActionResult AddFileX(IEnumerable<HttpPostedFileBase> files) 
    { 
     foreach (var file in files) 
     { 
      if (file.ContentLength > 0) 
      { 
       var fileName = Path.GetFileName(file.FileName); 
       var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
       file.SaveAs(path); 
      } 
     } 
     // I would like to return a message or an ID of something 
     // (eg "you are about to overwrite your files" or the ID of something not shown here) 
     return View("IdxUpload"); // This line probably needs to be changed 
    } 

回答

1

退房此斯科特Hanselman的文章的底部。他基本上演示了如何将有关文件上传状态的信息发回给用户。特别是他创建了一个ViewModel来保存fileUpload结果,根据每个文件的上传状态创建一个结果列表,并通过将信息传递给View来呈现给用户。

http://www.hanselman.com/blog/ABackToBasicsCaseStudyImplementingHTTPFileUploadWithASPNETMVCIncludingTestsAndMocks.aspx

编辑:

如果你正在寻找上传时(在文件已经存在的情况下),以提示用户进行确认,您可以:

(一)使用javascript ajax调用来检查文件是否存在并在发布之前提示用户 - 或者 -

(b)允许用户提交,将文件保存到临时位置,提示用户输入在另一个视图中确认,如果用户确认则处理文件。

例(一):

[控制器]

public ActionResult AddFileForm() { 
    return View(); 
} 

[HttpPost] 
public ActionResult AddFileX(IEnumerable<HttpPostedFileBase> files) { 
    // do what you need to save your files and/or update your db 
    foreach (var file in files) { 
     if (file.ContentLength > 0) { 
     var fileName = Path.GetFileName(file.FileName); 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 
     } 
    } 

    // collect the updated file ids and send to View to render (should prob use Strongly typed class(es)) 
    string[] results = {"123", "456", "789"}; 

    return View(results); 
} 

[HttpPost] 
public JsonResult FileExists(List<string> filelist) { 
    //check if file(s) exist given filename 

    // return ids for files that already exist on your system 
    string[] results = {"123", "", "789"}; 
    return Json(results); 
} 

[查看]对于AddFileForm

@using (Html.BeginForm("AddFileX", "File", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input id="f1" type="file" name="files" multiple="true" /> 
    <input id="f2" type="file" name="files" multiple="true" /> 
    <input id="overwrite" type="hidden" value="false" /> 
    <input id="submit" type="submit" value="Upload" /> 
} 

<script> 
    $(document).ready(function() { 
     $('#submit').click(function (e) { 
     if ($('#overwrite').val() == 'true') 
      return; //proceed w/ submit 

     e.preventDefault(); 

     // collect filenames of proposed file updates 
     var files = []; 
     $('input[type=file]').each(function() { 
      var filename = $(this).val(); 
      files.push(filename); 
     }); 

     // send request to check if files exist 
     $.ajax({ 
      type: "POST", 
      url: "/File/FileExists", 
      data: { filelist: files }, 
      success: function (data) { 
       confirmUpload(data); 
      }, 
      traditional: true 
     }); 
     }); 
    }); 

    function confirmUpload(results) { 
     var existing = false; 
     $(results).each(function() { 
     var fid = $(this)[0]; 
     if (fid.length > 0) { 
      existing = true; //file exists on Server, fid returned. 

      //do stuff..highlight table row..etc 
     } 
     }); 

     if (existing) { 
     //do whatever to request confirmation, show a message div, etc 
     var answer = confirm("Overwrite files?"); 
     if (answer) { 
      // if confirmed, set flag submit form 
      $('#overwrite').val('true'); 
      $('#submit').click(); //$('form').submit() - unreliable 
     } 
     } 
    } 
</script> 

希望这给你一些想法。

+0

谢谢Itiong-sh,因为我supspected我不能正确解释问题。有时候,看似简单的东西往往很难解释。如果我正确理解你的链接,它所做的只是将结果返回到其他页面。我希望给用户一个覆盖文件的选项(如果存在的话)。看起来像我这样明显的要求超出了我的解释能力,这真是令人沮丧。我假设你仍然不知道我想达到什么。 – user1384117

+0

肯定..有意义。当我今天晚些时候能够做到时,我会给出另一种选择。 –

+0

感谢Itiong-sh,这将不胜感激。抱歉关于延迟回复,但我不得不去睡觉:-) – user1384117

0

如果你不想使用ajax文件上传插件,你可以做一件非常简单的事情。

假设你有文件上传元素的视图被命名为view1 所以当视图1被发布到操作方法时检查是否已经上传或已存在的文件(这部分我认为你已经完成了)

接下来在viewbag中添加一条消息,就像这样ViewData.Message =“Files have been loaded”; 并返回相同的视图

在您的视图中的任何地方(最好在最后)添加一行。 @ ViewData.Message。这种方式任何消息,你想展示给用户将显示用户