ASP.NET MVC - 改进Drop-Down Box代码所需的帮助?

时间:2013-01-16 11:21:34

标签: .net asp.net-mvc razor

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

一切正常,但我想知道更好的方法。另外,如果可以使用<创建相同的下拉菜单,请告诉我。选择>而不是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>

1 个答案:

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