2014-09-23 2 views
0

У меня есть город, классКак выбрать объект в раскрывающемся списке

public class City 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string CountryCode { get; set; } 
} 

и учащемуся езды.

public class Ride 
{ 
    public Guid Id { get; set; } 
    public City From { get; set; } 
    public List<City> To { get; set; } 
    public DateTime DateAndTime { get; set; } 
}  

Что является лучшим способом для загрузки города, передать его для просмотра, показать их в DropDownLists и данные POST обратно в контроллер? Лучше всего было бы, если бы я мог добавить более одного столбца «Город в». Я нашел Selectize.js, но у меня нет опыта работы с JavaScript. Могу ли я передавать только параметры JSON и т. Д., Или это список городов из базы данных.

Спасибо за ваше время.

ответ

1

Вам понадобится модель просмотра, особенно если вы хотите сразу выбрать несколько городов. Например:

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) 

Вы можете использовать одинаковые варианты для обоих, так как они оба выбирают города.

Смежные вопросы