2016-04-06 2 views
1

Im работает над приложением, которое может загружать электронные письма. На мой взгляд, если отмечены флажки/флажки, я хочу передать идентификатор контроллеру для загрузки этих сообщений. Я попытаюсь объяснить, с кодом:Asp.net mvc как передать несколько значений флажков контроллеру

@using (Html.BeginForm("DownloadData", "Messages", FormMethod.Post)) 
    { 
     <table class="table table-bordered table-hover"> 
      @for (int i = 0; i < Model.Count; i++) 
      { 
      <tr> 
       <td><input type="checkbox"  
       name="selectedIds[@i].messageID"/></td> 
       <td>@Model[i].messageFrom</td> 
       <td>@Model[i].messageSubject</td> 
       <td>@Model[i].messageDate</td> 
      </tr> 
      } 
     </table> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" class="btn btn-default" value="Download" /> 
     </div> 
    } 

@i во имя = «selectedIds [@i] .messageID» оленья кожа будет хорошо, потому что его растет, и если я проверить: первая 2-й и 4-й сообщение , он добавит только первые два элемента в мой список.

Контроллер:

[HttpPost] 
    public ActionResult DownloadData(List<MessagesModels> selectedIds) 
    { 
     return View(...); 
    } 

Модель:

public class MessagesModels 
    { 
    public int messageID { get; set; } 
    public string messageSubject { get; set; } 
    ... 
    } 

Я думаю, что оно не трудно, но не может найти гуманную. Спасибо за тех, кто может помочь!

+1

Что я могу сделать? Он не привязан ни к чему в вашей модели и даже не имеет атрибута value. Если вы хотите указать, какой из ваших объектов выбран, добавьте в свою модель свойство 'bool IsSelected' и используйте' @ Html.CheckBoxFor (m =

ответ

3

Чтобы избежать изменений вашей модели сообщений только для этого вида (или, если вы не может начать с) я бы рекомендовал создать новую модель для этой точки зрения для обработки выбора, как это:

public class MessageSelectionViewModel 
{ 
    public MessagesModels Message { get; set; } 
    public bool IsSelected { get; set; } 
} 

Ваше мнение будет теперь будет список этих новых объектов зрения так будет выглядеть следующим образом:

<td>@Html.CheckBoxFor(item => item[i].IsSelected)</td> 
<td style="display:none;">@Html.HiddenFor(item => item[i].Message.Id)</td> 
<td>@Model[i].Message.messageFrom</td> 
<td>@Model[i].Message.messageSubject</td> 
<td>@Model[i].Message.messageDate</td> 

Ваш метод пост стал бы:

[HttpPost] 
public ActionResult DownloadData(IEnumerable<MessageSelectionViewModel> selectedMessages) 
{ 
    foreach (int messageId in selectedMessages.Where(m => m.IsSelected == true).Select(m => m.Message.Id)) 
    { 
    } 
    return View(...); 
} 

Конечно, если это неважно, вы можете сэкономить время и силы и просто добавить IsSelected к своей модели, как предложил Стивен.