Ho una relazione molti a molti tra auto e molti altri tavoli. Dal mio punto di vista, voglio essere in grado di avere un elenco a selezione multipla per elementi come le luci. Ho provato molti formati diversi non riesco a ottenere l'elenco per impostare gli elementi selezionati.Il mio modo preferito per farlo sarebbe @ Html.ListBoxFor (model => model.enitity.relatedentity, Model.SomeSelectListItemList), ma io non riesco a ottenere la lista per impostare gli elementi selezionati nella vista.
Di seguito è riportato il mio codice che stavo testando con Asp.net MVC5, C # e Entity Framework 6.
Questa è l'azione del mio controller
// GET: Car/Edit/
[Authorize(Roles = "Ecar")]
public ActionResult Edit(int id)
{
CarsEditViewModel carEditViewModel = new CarsEditViewModel();
carEditViewModel.Cars = unitOfWorkcar.CarRepository.FindIncluding(id);
IList<Approval> approvalList = unitOfWorkcar.ApprovalRepository.All.ToList();
IList<Connector> connectorList = unitOfWorkcar.ConnectorRepository.All.ToList();
IList<InputVoltage> inputVoltagesList = unitOfWorkcar.InputVoltageRepository.All.ToList();
carEditViewModel.ApprovalList = from c in approvalList select new SelectListItem { Text = c.Name, Value = c.Id.ToString(), Selected = true};
carEditViewModel.Categories = new MultiSelectList(carEditViewModel.ApprovalList, "Value", "Text", "Selected");
// ,carEditViewModel.ApprovalList.Select(c => c.Text),carEditViewModel.ApprovalList.Select(c => c.Selected)
//carEditViewModel.ApprovalList = from c in approvalList select new MultiSelectList( //{ Selected = (carEditViewModel.Cars.Approvals.Any(app => app.Id == c.Id)) , Text = c.Name, Value = c.Id.ToString() };
// carEditViewModel.ConnectorList = from c in connectorList select new SelectListItem { Selected = true, Text = c.Name, Value = c.Id.ToString() };
carEditViewModel.InputVoltageList = from c in inputVoltagesList select new SelectListItem { Text = c.Name, Value = c.Id.ToString() };
return View(carEditViewModel);
}
Ecco la mia opinione
@model NewBobPortal.ViewModels.CarsEditViewModel
@using (Html.BeginForm())
{
@* @Html.ListBoxFor("SelectedApprovals",model => model., new { @class = "multiselect" })*@
@*@Html.ListBoxFor(model => model.Cars.Approvals, Model.ApprovalList)
@Html.ListBoxFor(model => model.Cars.Connectors,Model.ConnectorList, new {Multiple = "multiple"})
@Html.ListBoxFor(model => model.ConnectorList, Model.ConnectorList)*@
@*@Html.ListBox("test",Model.Cars.InputVoltages, Model.InputVoltageList)*@
@Html.DropDownList("somethingelse", new MultiSelectList(Model.InputVoltageList, "Value", "Text", Model.InputVoltageList.Select(c => c.Value)), new { multiple = "multiple" })
@Html.DropDownListFor(model => model.Cars.InputVoltages , new MultiSelectList(Model.LensColorList, "Value", "Text", Model.LensColorList.Select(c => c.Value)), new { multiple = "multiple" })
@Html.ListBoxFor(m => m.Cars.Approvals, Model.Categories)
<p>
<input type="submit" value="Save" />
</p>
}
Questo è il mio viewmodel
using NewBobPortal.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace NewBobPortal.ViewModels
{
public class CarsEditViewModel
{
public Car Cars { get; set; }
public IEnumerable<SelectListItem> ApprovalList { get; set; }
public IEnumerable<MultiSelectList> ConnectorList { get; set; }
public IEnumerable<SelectListItem> InputVoltageList { get; set; }
public MultiSelectList Categories { get; set; }
public IEnumerable<Approval> SelectedCategories { get; set; }
}
}
Il problema più grande con la pubblicazione di valori per una relazione molti-a-molti è che non esiste un campo diretto da associare al modello. È qui che i modelli di visualizzazione diventano molto utili, che stai già utilizzando, ma non nel modo giusto per questo.
Per prima cosa hai bisogno del tuo SelectList
, che in realtà può essere solo un oggetto IEnumerable<SelectListItem>
. Questo conterrà tutte le opzioni disponibili, che è abbastanza facile. Quindi nel tuo modello di vista:
public IEnumerable<SelectListItem> CategoryChoices { get; set; }
E nella tua azione:
carEditViewModel.CategoryChoices = approvalList.Select(m => new SelectListItem {
Text = c.Name,
Value = c.Id.ToString()
});
Si noti che non sto impostando Selected
: lasceremo che HtmlHelper gestisca ciò. Non ho nemmeno a che fare con una MultiSelectList
.
Ora, avrai anche bisogno di qualcosa su cui postare, poiché i tuoi valori saranno id, useremo un List<int>
, quindi nel tuo modello di vista:
private List<int> selectedCategories;
public List<int> SelectedCategories
{
get
{
if (selectCategories == null)
{
selectedCategories = Categories.Select(m => m.Id).ToList();
}
return selectedCategories;
}
set { selectedCategories = value; }
}
C'è un po 'che succede qui. Il metodo set
della proprietà è semplice: quando si ottiene un valore registrato, basta impostare le categorie selectedCategories
su quello. Il get
è un po 'più complicato: qui abbiamo bisogno di condensare il vostro elenco di categorie di oggetti (chiamati Categories
qui perché non so dove questo è in realtà proviene da) in un semplice elenco di ID per queste categorie.
Ora, a tuo avviso:
@Html.ListBoxFor(m => m.SelectedCategories, Model.CategoryChoices)
Questo è tutto ciò di cui hai bisogno. Stai utilizzando un controllo ListBox
modo che sia già un elenco a selezione multipla. E, legandolo alla lista di tutti gli id attualmente selezionati, sa quali elementi selezionare automaticamente nell'elenco di SelectListItem
che ottiene da Model.CategoryChoices
.
Nella tua azione post, devi quindi tradurre questi ID nei loro oggetti associati:
var newCategories = repository.Categories.Where(m => carEditViewModel.SelectedCategories.Contains(m.Id));
Quindi, puoi impostare le categorie del tuo modello su questo nuovo elenco manualmente:
car.Categories = newCategories;