Как использовать выпадающий список для того, чтобы выбрать несколько значений?

#asp.net-mvc-4

#asp.net-mvc-4

Вопрос:

У меня есть модель, и в этой модели я создал List<SelectListItem> для выбора нескольких значений, в HTML отображаются эти значения. Эти значения поступают из IList<FormaPagamento> . Итак, теперь мне нужно добавить несколько значений в мою модель, но я не могу этого сделать, я выбираю несколько значений, но когда я выполняю отправку, List<SelectListItem> пусто.

Как я мог это сделать?

пытаюсь.

Модель

 public class EmpresaModel{
    [Required(ErrorMessage="Informe ao menos uma forma de pagamento disponível")]
    public List<SelectListItem> formasPagto { get; set; }
}
  

Контроллер

 private List<SelectListItem> getFormasPagto() {
    IList<FormaPagamento> lista = fpDAO.findAll();
    List<SelectListItem> dropDown = new List<SelectListItem>();
    foreach (FormaPagamento x in lista) {
        dropDown.Add(new SelectListItem { Text = x.descricao, Value = Convert.ToString(x.id)});
    }
    return dropDown;
}

public ActionResult add() {
    EmpresaModel model = new EmpresaModel();
    model.formasPagto = getFormasPagto();
    return View(model);
}

public JsonResult addAjax(EmpresaModel model) {     
   Debug.WriteLine("Formas Pagto: "   model.formasPagto.Count);
   return Json(jsonResposta);
}
  

HTML

 @model EmpresaModel
<div class="form-group">
    <label for="name" class="cols-sm-2 control-label">Formas de pagamento disponíveis <img src="~/Imagens/required.png" height="6" width="6"></label>
    @Html.DropDownListFor(model => Model.formasPagto, Model.formasPagto, new { Class = "form-control", placeholder = "Selecione as formas de pagamento disponíveis", @multiple = true})
    @Html.ValidationMessageFor(model => Model.formasPagto)
</div>
  

Ответ №1:

formasPagto является IEnumerable<SelectListItem> — вы не можете привязать <select> к коллекции сложных объектов. <select multiple> Возвращает только массив простых значений (значения выбранных параметров).

Вашей модели требуется свойство для привязки, скажем

 [Required(ErrorMessage="Informe ao menos uma forma de pagamento disponível")]
public IEnumerable<int> SelectedItems { get; set; }
  

предполагая, что id свойством FormaPagamento является typeof int . Обратите также внимание, что [Required] атрибут применяется к этому свойству, а не к SelectList .

. И для создания <select multiple> вы используете LstBoxFor() , не DropDownListFor()

 <label for="@Html.IdFor(m.SelectedItems)" class="cols-sm-2 control-label">Formas de pagamento disponíveis
    <img src="~/Imagens/required.png" height="6" width="6">
</label>
@Html.ListBoxFor(m => m.SelectedItems, Model.formasPagto, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.SelectedItems)
  

Примечание сбоку: Вы можете просто использовать

 model.formasPagto = new SelectList(fpDAO.findAll(), "id", "descricao");
  

или

 model.formasPagto = fpDAO.findAll().Select(x => new SelectListItem
{
    Value = x.id.ToString(),
    Text = descricao
});
  

чтобы сгенерировать SelectList