web-dev-qa-db-ja.com

DropdownListヘルパーを使用してMultiSelect <select>を適切に作成するにはどうすればよいですか?

(申し訳ありませんが、ここにいくつかの項目がありますが、どれも私がこれを機能させることを可能にしていないようです。)

複数選択を可能にするDropDownListを作成します。リストを作成できますが、現在選択されている値が機能しているように見えません。

私のコントローラーには以下があります:

ViewBag.PropertyGroups = from g in db.eFinGroups
                              where g.GroupType.Contents == "P"
                              select new
                              {
                                  Key = g.Key,
                                  Value = g.Description,
                                  Selected = true
                              };


ViewBag.SelectedPropertyGroups = from g in company.Entities .First().Properties.First().PropertyGroups select new { g.eFinGroup.Key, Value = g.eFinGroup.Description };

私の見解では:

@Html.DropDownListFor(model => model.PropertyGroupsX, 
   new MultiSelectList(ViewBag.PropertyGroups
             , "Key", "Value"
             , ViewBag.SelectedPropertyGroups), 
new { @class = "chzn-select", data_placeholder = "Choose a Property Group", multiple = "multiple", style = "width:350px;" })

PropertyGroupXはモデルのstring []です。

選択したプロパティを使用してすべてのタイプの反復を試みました...値のみ、キーのみなどの両方を渡します。

また、PropertyGroupXはどのタイプであると想定されていますか?文字列配列は正しいですか?それとも、現在のプロパティグループを含む辞書にする必要がありますか?これに関するドキュメントを見つけるのに本当に苦労しています。

誰かがListBoxForを使うべきだと提案しました。私はそれに変更しましたが、それでも同じ問題があります。選択した値は、オプションタグがレンダリングされるときに選択済みとして設定されていません。これが私が試したものです:

@ Html.ListBoxFor(model => model.PropertyGroups、new MultiSelectList(ViewBag.PropertyGroups、 "Key"、 "Value"))

私はmodel.PropertyGroupsを、値に一致する文字列のコレクションとして、このIDに一致するGuidのコレクションとして、およびViewBagの項目に一致するキーと値の両方を持つ匿名タイプとして試しました。何も動作しないようです。

28
PilotBob

複数選択リストを作成する場合は、DropDownListForを使用しません。 ListBoxForヘルパーを使用します。

モデルを見る:

public class MyViewModel
{
    public string[] SelectedIds { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

コントローラ:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // preselect the first and the third item given their ids
        SelectedIds = new[] { "1", "3" }, 

        // fetch the items from some data source
        Items = Enumerable.Range(1, 5).Select(x => new SelectListItem
        {
            Value = x.ToString(),
            Text = "item " + x
        })
    };
    return View(model);
}

見る:

@model MyViewModel
@Html.ListBoxFor(x => x.SelectedIds, Model.Items)
55
Darin Dimitrov