2014-09-23 65 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; } 
}  

什麼是加載城市,通過它來查看,顯示他們在下拉列表和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) 

您可以對兩者使用相同的選項,因爲它們是既選擇城市。