1

以下のドロップダウンを作成して、都市のリストを作成しました。

すべて正常に動作しますが、これを行うためのより良い方法を知りたいと思います。また、HTMLヘルパーの代わりに<Select>を使用して同じドロップダウンを作成できるかどうかをお知らせください。

以下は私の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 に答える