问题描述
我在我的 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>
然后在控制器中我需要 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中显示的文本。
@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();
}
结果:
更新:
下拉列表的两种显示方式:
第一个:
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>