我创建了以下下拉列表来填充城市列表。
一切正常,但我想知道更好的方法。另外,如果可以使用<创建相同的下拉菜单,请告诉我。选择>而不是HTML助手。
以下是我的DTO课程。请告知我是否可以对控制器和视图进行改进。
//ViewModel
public class LocationDTO
{
public IEnumerable<CityDTO> Cities { get; set; }
public LocationDTO()
{
this.Cities = new CityDTO[] { };
}
}
public class CityDTO
{
public string CityId { get; set; }
public string CityName { get; set; }
}
下面是我的Controller,我使用了实体框架数据库第一种方法从数据库中获取数据。您能否解决我需要在控制器上进行的改进?
//Controller
Models.LocationDTO Loc = new Models.LocationDTO();
EF.LocationEntities locCtx = new EF.LocationEntities();
public Action Result Index() {
using(locCtx) {
var locResults = (from q in locCtx.usp_GetAllCities()
Select new Models.CityDTO {
CityId = q.Id,
CityName = q.Name });
loc.Cities = locResults.ToList();
}
List<Models.CityDTO> citiesList = new List<Models.CityDTO>();
Models.CityDTO city = new Models.CityDTO() { CityId = "-1", CityName = "Select City" };
citiesList.Add(city);
citiesList.AddRange(Loc.Cities.ToList());
ViewBag.CitiesDropDown = citiesList;
return view(loc);
}
以下是我的观点。我也想知道Lamdba表达式在这种情况下是如何工作的。
//View
@{
List<TestApp.Models.CityDTO> citiesList = ViewBag.CitiesDropDown;
var cityItems = new SelectList(citiesList, "CityId", "CityName");
}
<div>
Cities: @Html.DropDownListFor(x => x.Cities.SingleOrDefault().CityID, @cityItems)
</div>
答案 0 :(得分:3)
您的控制器可以进行许多改进。
让我们从抽象数据访问开始:
public interface ICitiesRepository
{
IEnumerable<City> GetAll();
}
然后有一个实现:
public class CitiesRepositoryEF: ICitiesRepository
{
public IEnumerable<City> GetAll()
{
using (var ctx = new LocationEntities())
{
return ctx.usp_GetAllCities().ToList();
}
}
}
好的,现在让我们为我们的视图定义一个视图模型:
public class MyViewModel
{
public string SelectedCityId { get; set; }
public IEnumerable<SelectListItem> Cities { get; set; }
}
接下来是控制器:
public class CitiesController: Controller
{
private readonly ICitiesRepository repository;
public CitiesController(ICitiesRepository repository)
{
this.repository = repository;
}
public ActionResult Index()
{
var model = new MyViewModel();
model.Cities = this
.repository
.GetAll()
.ToList()
.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks for selecting city: " + model.SelectedCityId);
}
}
最后你将得到一个相应的视图,它当然会强烈地输入到视图模型中:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x => x.SelectedCityId, Model.Cities, "Select City")
<button type="submit">OK</button>
}
现在剩下的就是配置你最喜欢的依赖注入框架,将CitiesRepositoryEF
具体实例注入控制器。