2016-05-09 50 views
0

我是MVC的新手,我遇到了一个我似乎无法解决的问题。我已经看到过几篇关于类似问题的文章,但没有什么能够让我满足我需要实现的法案。在MVC中处理多个多文件输入

我有一个MVC4项目,我需要在一个页面上有多个多文件输入,我需要能够区分通过哪个输入提交哪些文件。

我见过this SO文章建议有多个Post动作参数,但我的代码似乎将它们全部作为单个列表处理。

这里是我的控制器代码:

public ActionResult ProjectDocuments(C4Tbl_UploadedFiles c4tbl_uploadedfiles, IEnumerable<HttpPostedFileBase> File1, IEnumerable<HttpPostedFileBase> File2) 
    { 
     try 
     { 
      foreach (var file in File1) 
      { 
       if (file.ContentLength > 0) 
       { 
        //Handle the first file list 
       } 
      } 
      foreach (var file in File2) 
      { 
       if (file.ContentLength > 0) 
       { 
        //Handle the second file list 
       } 
      } 

这里是我查看代码:

<table border="0" id="cssTable" class="nobg"> 
    <tr> 
     <th style="width: 100px; min-width: 100px; max-width: 100px"> 
      <b>Type</b> 
     </th> 
     <th style="width: 400px; min-width: 400px; max-width: 400px"> 
      <b>File to Upload</b> 
     </th> 
     <th style="width: 500px; min-width: 500px; max-width: 500px"> 
      <b>Status</b> 
     </th> 
    </tr> 
    <tr> 
     <td style="width: 100px; min-width: 100px; max-width: 100px"> 
      <b>Blueprint(s)</b> 
     </td> 
     <td style="width: 400px; min-width: 400px; max-width: 400px"> 
      <input type="file" name="File1" id="BP" multiple style="width: 380px"/> 
     </td> 
     <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
      @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname="group1" }) Uploaded  
      @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname="group1" }) Not Uploaded  
      @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname="group1" }) Not Applicable 
     </td> 
    </tr> 
    <tr> 
     <td style="width: 100px; min-width: 100px; max-width: 100px"> 
      <b>Recovery Guide(s)</b> 
     </td> 
     <td style="width: 400px; min-width: 400px; max-width: 400px"> 
      <input type="file" name="File2" id="RG" multiple style="width: 380px"/> 
     </td> 
     <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
      @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname="group2" }) Uploaded  
      @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname="group2" }) Not Uploaded  
      @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname="group2" }) Not Applicable 
     </td> 
     <td> 
      <input type="submit" value="Submit" name="submit" /> 
     </td> 
    </tr> 
</table> 

我需要能够接受任何或所有输入端已经提供的文件,我需要要知道我的哪些输入是通过文件提交的,所以我知道它们是哪种类型的文件,所以我可以在我的表中创建相关的数据库条目。

任何人都可以看到一个简单的解决方案,并指出我在正确的方向吗?

+1

的名字你控件是'File1'和'File2',所以你的参数需要'IEnumerable Fi le1,IEnumerable File'(注意 - 你第二组单选按钮将被忽略,因为你给它们的名字与第一组名相同) –

+0

谢谢Stephen,我改变了一些帖子的代码读得不好。我已经编辑了这个现在正确读取。 – Nevski

+0

在你的编辑中该方法的签名现在是正确的,你可以遍历File1和File2中的文件foreach(File1中的var文件){...' –

回答

0

感谢您的回答。我已经将此标记为当前编辑的帖子作品,尽管我确信有更有效的方法来完成此操作。

这是工作控制器代码:

public ActionResult ProjectDocuments(C4Tbl_UploadedFiles c4tbl_uploadedfiles, IEnumerable<HttpPostedFileBase> File1, IEnumerable<HttpPostedFileBase> File2) 
{ 
    try 
    { 
     foreach (var file in File1) 
     { 
      if (file.ContentLength > 0) 
      { 
       //Handle the first file list 
      } 
     } 
     foreach (var file in File2) 
     { 
      if (file.ContentLength > 0) 
      { 
       //Handle the second file list 
      } 
     } 

这是工作查看代码:

<table border="0" id="cssTable" class="nobg"> 
<tr> 
    <th style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Type</b> 
    </th> 
    <th style="width: 400px; min-width: 400px; max-width: 400px"> 
     <b>File to Upload</b> 
    </th> 
    <th style="width: 500px; min-width: 500px; max-width: 500px"> 
     <b>Status</b> 
    </th> 
</tr> 
<tr> 
    <td style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Blueprint(s)</b> 
    </td> 
    <td style="width: 400px; min-width: 400px; max-width: 400px"> 
     <input type="file" name="File1" id="BP" multiple style="width: 380px"/> 
    </td> 
    <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
     @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname="group1" }) Uploaded  
     @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname="group1" }) Not Uploaded  
     @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname="group1" }) Not Applicable 
    </td> 
</tr> 
<tr> 
    <td style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Recovery Guide(s)</b> 
    </td> 
    <td style="width: 400px; min-width: 400px; max-width: 400px"> 
     <input type="file" name="File2" id="RG" multiple style="width: 380px"/> 
    </td> 
    <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
     @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname="group2" }) Uploaded  
     @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname="group2" }) Not Uploaded  
     @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname="group2" }) Not Applicable 
    </td> 
    <td> 
     <input type="submit" value="Submit" name="submit" /> 
    </td> 
</tr> 

感谢所有帮助和建议

+0

你不是刚刚使用别人的代码,而是自己回答了吗?如果其他人花时间回答你,至少要给他尊重,以表明他的回答是正确的。 – webnoob

+0

我实际上使用了@StephenMuecke的输入来编辑帖子中的代码。代码几乎没有改变,并且原始问题的参数中只有1个错误。我从来没有使用别人的答案,并标记为答案。 – Nevski

+0

在这种情况下,没有问题:)一些新用户并不真正知道SO如何工作,所以最好检查一下。 – webnoob

-1

查看

@using (Html.BeginForm("Multiple", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { 
<table border="0" id="cssTable" class="nobg"> 
<tr> 
    <th style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Type</b> 
    </th> 
    <th style="width: 400px; min-width: 400px; max-width: 400px"> 
     <b>File to Upload</b> 
    </th> 
    <th style="width: 500px; min-width: 500px; max-width: 500px"> 
     <b>Status</b> 
    </th> 
</tr> 
<tr> 
    <td style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Blueprint(s)</b> 
    </td> 
    <td style="width: 400px; min-width: 400px; max-width: 400px"> 
     <input type="file" name="File1" id="BP" multiple style="width: 380px" /> 
    </td> 
    <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
     @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname = "group1" }) Uploaded 
     @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname = "group1" }) Not Uploaded 
     @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname = "group1" }) Not Applicable 
    </td> 
</tr> 
<tr> 
    <td style="width: 100px; min-width: 100px; max-width: 100px"> 
     <b>Recovery Guide(s)</b> 
    </td> 
    <td style="width: 400px; min-width: 400px; max-width: 400px"> 
     <input type="file" name="File2" id="RG" multiple style="width: 380px" /> 
    </td> 
    <td style="width: 500px; min-width: 500px; max-width: 500px; text-align: left"> 
     @Html.RadioButton("Submitted", "Yes", false, new { @style = "width: 25px;", groupname = "group2" }) Uploaded 
     @Html.RadioButton("Submitted", "No", false, new { @style = "width: 25px;", groupname = "group2" }) Not Uploaded 
     @Html.RadioButton("Submitted", "N/A", false, new { @style = "width: 25px;", groupname = "group2" }) Not Applicable 
    </td> 
    <td> 
     <input type="submit" value="Submit" name="submit" /> 
    </td> 
</tr> 

}

控制器

[HttpPost] 
    public ActionResult Multiple(IEnumerable<HttpPostedFileBase> File1, IEnumerable<HttpPostedFileBase> File2) 
    { 
     try 
     { 
      foreach (var file in File1) 
      { 
       if (file.ContentLength > 0) 
       { 
        //Handle the first file list 
       } 
      } 
      foreach (var file in File2) 
      { 
       if (file.ContentLength > 0) 
       { 
        //Handle the second file list 
       } 
      } 

     } 
     catch (Exception ex) 
     { 

     } 
     return View(); 
    } 

请查看输出,你可以在你的行动上传的文件。 enter image description here

+0

感谢您的回复。我不明白这将如何区分通过多个输入提交的文件?我错过了明显的东西吗?对不起,如果这是一个愚蠢的问题! – Nevski

+1

使用此解决方案,无法知道哪个输入将文件提交给控制器。另外,jQuery fileupload在这里完全没有必要。 – Dygestor

0

文件上传到在Request.Files收集服务器,其 一个的每个由默认 MVC模式粘合剂映射到HttpPostedFileBase对象。因此,负责 处理上载文件的控制器操作需要一个参数,该参数表示一个HttpPostedFileBase对象集合 。

public ActionResult ProjectDocuments() 
{ 
    HttpPostedFileBase upPic = Request.Files["File1"]; 
    if (upPic != null && upPic.ContentLength != 0 && upPic.InputStream != null) 
    { 
     //Handle the first file list 
    } 
    upPic = Request.Files["File2"]; 
    if (upPic != null && upPic.ContentLength != 0 && upPic.InputStream != null) 
    { 
    //Handle the first file list 
    } 
    return View(); 
} 

多种文件上传。

public ActionResult ProjectDocuments(IEnumerable<HttpPostedFileBase> files) 
{ 
    foreach (HttpPostedFileBase file in files) 
    { 
    if (file != null && file .ContentLength != 0 && file .InputStream != null) 
    { 
    //Handle the first file list 
    } 
    } 
    return View(); 
} 
+1

感谢您的回复。我想过使用这个,但是由于每个输入都是针对多个文件的,我不认为这是一个合适的解决方案? – Nevski

+0

“试试这个”不是一个答案。请[编辑]你的回答,以解释在其中使用的原则,以及你的改变如何帮助OP。 – CodeCaster