我有一个City类
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; }
}
加载城市的最佳方式是什么,将其传递给查看,在下拉列表中显示它们以及将数据发送回控制器?如果我可以添加多个City to To列,那将是最好的。 我找到Selectize.js但我没有使用JavaScript的经验。我可以仅传递给JSON等选项,还是可以从数据库传递到城市列表。
感谢您的时间。
答案 0 :(得分: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)
您可以对两者使用相同的选项,因为它们都选择了城市。