Вам понадобится модель просмотра, особенно если вы хотите сразу выбрать несколько городов. Например:
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)
Вы можете использовать одинаковые варианты для обоих, так как они оба выбирают города.