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

How to select object in dropdown

本文关键字:选择 对象 下拉列表      更新时间:2023-09-26

我有一个城市级

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

和Ride课程。

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等选项吗?也可以是数据库中的城市列表。

谢谢你抽出时间。

您需要一个视图模型,尤其是如果您想同时选择多个城市。例如:

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)

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