2

私は EntityFramework をデータアクセスとして使用して、asp.net mvc Web アプリケーションでエンドユーザーに国の DropDownList を表示しています。

これを達成するのは難しいことではありませんが、見栄えの良い方法を見つけるのに少し苦労しています.

しかし、まず最初にいくつかのコード:

<td>
     @Html.DropDownListFor(x => x.ParentId, repos.GetParents(@Model.ParentId)
</td>

実際のコードの奥深く:

class dummy
    {
        public string Text { get; set; }
        public int Value { get; set; }
    }

    private SelectList _parents;
    public SelectList Parents
    {
        get
        {
            if (_parents == null)
            {
                var parents = Entities.Instance.Partners.Select(x => new dummy() { Text = x.Name, Value = x.Id }).OrderBy(x => x.Text).ToList();
                parents.Insert(0, new dummy());

                _parents = new SelectList(parents, "Value", "Text");
            }
            return _parents;
        }
    }

    public SelectList GetParents(int? parentId)
    {
        if (parentId != 0 && parentId.HasValue)
        {
            //setSelected
        }
        return Parents;
    }

ご覧のとおり、データをコピーするためだけに* * ダミー クラスを作成しました。なんで?x.Id.ToStringまたは同等のメソッドがエンティティへのlinqで機能しないため...

それでも、SqlFunctions.Tostring((double)x.ID)これは完璧な解決策ではありませんが、十分な解決策のようなものがあります。少なくとも私が見るまでは、ID 4 がstring「*lotsofspaces*4」のようになり、各値をトリミングすることは、私にとって良い解決策とは思えませんでした。

最も美しいコード ソリューションは次のとおりです。

new SelectList(Entities.Instance.Partners, "Id", "Name");

美しいですね。:) いいえ、ちがいます!ID 列と名前列だけでなく、パートナーからのデータ全体を選択するためです。

私の質問: 私の valueField がintvaluetypeであるときに、ドロップダウンで EntityFrame から My Data を取得するためのクリーンで見栄えの良い方法を教えてください。

4

3 に答える 3

2

いくつかのこと:

  1. ダミー クラスを作成する必要はありません。単に使用するDictionary<int, string>
  2. ビューから呼び出さないでくださいGetParents。コントローラーのアクション メソッドでこれを行い、リストをビューに渡します。
  3. 空のアイテムをリストに挿入する必要はありません。DropDownList HTML ヘルパーには、最初のオプションとして設定する空の項目のテキストを取り込むオーバーロードがあります。以下のコードでは「Select...」と表示されますが、単に空の文字列を指定することもできます。

あなたのコードの深いところに:

public Dictionary<int, string> GetItems(int parentId)
{
    return (from partner in Entities.Instance.Partners
               order by partner.Text
              select partner).ToDictionary(x => x.Id, v => v.Name);

}

コントローラ:

public ActionMethod MyPage(int parentId)
{
    var myView = new MyViewModel();
    myView.Items = _service.GetItems(parentId);
}

意見:

@Html.DropDownList("parentId", new SelectList(Model.Items, "Key", "Value"), "Select...")
于 2013-08-07T15:45:12.757 に答える
1

基本的には同じことを行うことができますが、遅延して「ダミー」を使用する代わりに、匿名型を使用できます。

new SelectList(Entities
    .Instance
    .Partners
    .Select(e => new 
    {
        Id = e.Id,
        Name = e.Name,
    }), "Id", "Name");

もちろん、「データ層」になる可能性のあるものから SelectList を公開することは、ドロップダウン リストに入力するためにいくつかの追加の列を選択するよりもはるかに悪いことです。開発者としての時間は、数回の IO/Cpu サイクルよりもはるかに高価であることを忘れないでください。パフォーマンスよりも実装についてもっと心配してください。

于 2013-08-07T15:46:27.350 に答える