你需要一個視圖模型,特別是如果你想一次選擇多個城市。例如:
public class RideViewModel
{
public Guid Id { get; set; }
public DateTime DateAndTime { get; set; }
public int FromCityId { get; set; }
public List<int> ToCityIds { get; set; }
public IEnumerable<SelectListItem> CityChoices { get; set; }
}
請注意,視圖模型上沒有List<City>
屬性。取而代之的是ToCityIds
,它將存儲從列表框中選擇的ID值和將用於填充列表框的CityChoices
。您不能從列表框中發佈完整的City
對象,只能使用簡單的類型,如int
。因此,在POST上,您將使用ToCityIds
中的值從數據庫中查找City
實例。您的實體上的From
屬性也是如此。現在
,在你的控制器:
private void PopulateCityChoices(RideViewModel model)
{
model.CityChoices = db.Cities.Select(m => new SelectListItem
{
Value = m.Id,
Text = m.Name
});
}
public ActionResult Create()
{
var model = new RideViewModel();
PopulateCityChoices(model);
return View(model);
}
[HttpPost]
public ActionResult Create(RideViewModel model)
{
if (ModelState.IsValid)
{
// Create new `Ride` and map data over from model
var ride = new Ride
{
Id = Guid.NewGuid(),
DateAndTime = model.DateAndTime,
From = db.Cities.Find(model.FromCityId),
To = db.Cities.Where(m => m.ToCityIds.Contains(m.Id))
}
db.Rides.Add(ride);
db.SaveChanges();
}
// Must repopulate `CityChoices` after post if you need to return the form
// view again due to an error.
PopulateCityChoices(model);
return View(model);
}
最後,在您的視圖改變模型聲明:
@model Namespace.To.RideViewModel
,然後添加你的From
選擇列表和To
列表框:
@Html.DropDownListFor(m => m.FromCityId, Model.CityChoices)
@Html.ListBoxFor(m => m.ToCityIds, Model.CityChoices)
您可以對兩者使用相同的選項,因爲它們是既選擇城市。