1

我创建了以下下拉列表来填充城市列表。

一切正常,但我想知道这样做的更好方法。另外,请让我知道是否可以使用 < Select > 而不是 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

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>
4

1 回答 1

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具体实例注入控制器。

于 2013-01-16T15:00:52.217 回答