在 ASP .NET Core 的下拉列表中返回州和城市

问题描述

我在我的 Asp.core 项目上创建了一个表单。现在我想在该表单上添加一个显示州和城市的下拉列表。

我创建了一个模型和视图模型:

    [required(ErrorMessage = "required")]

    public string Title { get; set; }

    public long? ParentId { get; set; }


    public bool IsDeleted { get; set; }

    
    public bool IsActive { get; set; }

并在我的存储库和服务上编写一些方法来访问它:

存储库:

  public async Task<List<UserLocationviewmodel>> GetStateForUserInfo()
    {
        return await _context.Locations.Where(l => l.ParentId == null)
            .Select(l => new UserLocationviewmodel()
            {
                Title = l.Title,}).ToListAsync();
    }

    public async Task<List<UserLocationviewmodel>> GetCityForUserInfo(long locationId)
    {
      return await _context.Locations.Where(l => l.ParentId == locationId)
            .Select(l => new UserLocationviewmodel()
            {
                Title = l.Title,}).ToListAsync();
    }

和服务:

    public async Task<List<UserLocationviewmodel>> GetStateForUserInfo()
    {
       return await _packageRepository.GetStateForUserInfo();
    }

    public async Task<List<UserLocationviewmodel>> GetCityForUserInfo(long locationId)
    {
        return await _packageRepository.GetCityForUserInfo(locationId);
    }

然后在控制器上调用这些方法并返回视图数据:

  ViewData["State"] = _packageService.GetStateForUserInfo();
     
  ViewData["City"] = _packageService.GetCityForUserInfo(packageId);

鉴于我称之为:

@{
ViewData["Title"] = _localizer["GetUserInfo"];
IEnumerable<UserLocationviewmodel> State = ViewData["State"] as IEnumerable<UserLocationviewmodel>;
IEnumerable<UserLocationviewmodel> city = ViewData["City"] as IEnumerable<UserLocationviewmodel>;

}

但是当我想在选择标签上访问它时,我无法访问我的属性

                            <select   asp-for= "?????"   class="form-control  ">
                             
                            </select>

enter image description here


更新: 首先阅读我的存储库以获取位置 ID: 但我有错误

然后在控制器中我需要 id 所以我写:

var firstLocationId = state.FirstOrDefault()?.Id;
        var city = await _packageService.GetCityForUserInfo(firstLocationId);
        ViewData["City"] = new SelectList(city,"Title","Title");

解决方法

以下是您可以遵循的示例:

型号:

public class UserLocationViewModel
{
    public string Title { get; set; }
    public string City { get; set; }     //if you do not need post selected city or state
    public string State { get; set; }   //it is no need add these two properties
}
public class Location
{
    public long Id { get; set; }
    public string Title { get; set; }
    public long? ParentId { get; set; }
    public bool IsDeleted { get; set; }
    public bool IsActive { get; set; }
}

查看:

对于public SelectList(IEnumerable items,string dataValueField,string dataTextField);,第一个参数是源,第二个参数是select中的每个选项值,第三个参数是每个选项在html中显示的文本。

enter image description here

@model UserLocationViewModel
@{
    IEnumerable<UserLocationViewModel> State = ViewData["State"] as IEnumerable<UserLocationViewModel>;
    IEnumerable<UserLocationViewModel> city = ViewData["City"] as IEnumerable<UserLocationViewModel>;
}

<select asp-items="@(new SelectList(State,"Title","Title"))" class="form-control">
</select>

<select  asp-items="@(new SelectList(city,"Title"))" class="form-control">
</select>

控制器:

[HttpGet]
public async Task<IActionResult> Index()
{
    ViewData["State"] = _packageService.GetStateForUserInfo();    
    ViewData["City"] = _packageService.GetCityForUserInfo(packageId);
    return View();
}

如果您想将选定的城市或州发布给控制器:

Index.cshtml:

asp-for 中的映射属性应与 dataValueField(此处为Title)的类型相同。

@model UserLocationViewModel
@{
    IEnumerable<UserLocationViewModel> State = ViewData["State"] as IEnumerable<UserLocationViewModel>;
    IEnumerable<UserLocationViewModel> city = ViewData["City"] as IEnumerable<UserLocationViewModel>;
}
<form method="post">
    <select asp-for="State" asp-items="@(new SelectList(State,"Title"))" class="form-control">
    </select>

    <select asp-for="City" asp-items="@(new SelectList(city,"Title"))" class="form-control">
    </select>
    <input type="submit" value="Post" />
</form>

控制器:

[HttpGet]
public async Task<IActionResult> Index()
{
    ViewData["State"] = _packageService.GetStateForUserInfo();     
    ViewData["City"] = _packageService.GetCityForUserInfo(packageId);
    return View();
}
[HttpPost]
public IActionResult Index(UserLocationViewModel model)
{
    return View();
}

结果:

enter image description here


更新:

下拉列表的两种显示方式:

第一个:

ViewData["State"] = new List<SelectListItem>
{
    new SelectListItem{Text = "Value1",Value = "1"},new SelectListItem{Text = "Value2",Value = "2"},new SelectListItem{Text = "Value3",Value = "3"},new SelectListItem{Text = "Value4",Value = "4"}
}

剃刀视图:

<select asp-items="(IEnumerable<SelectListItem>)@ViewData["State"]" class="form-control">
</select>

第二个:

ViewData["State"] = await Locations.Where(l => l.ParentId == null)
                                    .Select(l => new UserLocationViewModel()
                                    {
                                        Title = l.Title,}).ToListAsync();

剃刀视图:

@{
IEnumerable<UserLocationViewModel> State = ViewData["State"] as IEnumerable<UserLocationViewModel>;   
 }
<select asp-items="@(new SelectList(State,"Title"))" class="form-control">
</select>