2016-05-09 1 views
0

Я новичок в MVC, и у меня есть проблема, которую я не могу решить. Я видел несколько статей по подобным вопросам, но ничто из того, что я мог бы подгонять за счет того, что мне нужно достичь.Обработка нескольких многофайловых входов в MVC

У меня есть проект MVC4, и мне нужно иметь несколько многофайловых входов на странице, и мне нужно иметь возможность различать, какие файлы были отправлены через какой вход.

Я видел this Статья SO, в которой предлагается наличие нескольких аргументов Post action, но мой код, кажется, обрабатывает их все как один список.

Вот мой код контроллера:

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' (боковое примечание - вы 2-й набор переключателей будет проигнорирован, потому что вы дали им то же имя, что и первый набор) –

+0

Спасибо Стивен, я изменил биты кода для сообщения, которое не было Я хорошо читаю. Я отредактировал это, чтобы правильно читать сейчас. – Nevski

+0

Подпись метода в вашем редактировании теперь правильная, и вы можете прокручивать файлы в файлах «Файл1» и «Файл2» - 'foreach (файл var в File1) {...' –

ответ

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 
      } 
     } 

Это работает View Code:

<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

Разве вы не использовали код от кого-то elses и ответили сами? ЕСЛИ другой парень нашел время ответить вам, по крайней мере, дать ему уважение, чтобы отметить его ответ как правильный. – 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, каждый один из которых отображается на объект HttpPostedFileBase по умолчанию MVC модель связующего с. Поэтому для действия контроллера, которому поручено обрабатывать загруженные файлы , требуется параметр, представляющий коллекцию объектов 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

Смежные вопросы