如何在下拉列表中选择对象

时间:2014-09-23 15:51:40

标签: javascript asp.net asp.net-mvc http-post

我有一个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等选项,还是可以从数据库传递到城市列表。

感谢您的时间。

1 个答案:

答案 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)

您可以对两者使用相同的选项,因为它们都选择了城市。