web-dev-qa-db-ja.com

タイプ 'System.Collections.Generic.List <string>'を 'System.Web.Mvc.SelectList'に変換できません

私は、文字列のリストを持つviewBagを持つ次のActionメソッドを持っています:

public ActionResult Login(string returnUrl)
        {
            List<string> domains = new List<string>();
    domains.Add("DomainA");

            ViewBag.ReturnUrl = returnUrl;
            ViewBag.Domains = domains;
            return View();
        }

そしてビューで私は次のようにviewBag文字列を表示するドロップダウンリストを構築しようとしています:

@Html.DropDownList("domains",(SelectList)ViewBag.domains )

しかし、私は次のエラーが発生しました:-

タイプ「System.Collections.Generic.List」を「System.Web.Mvc.SelectList」に変換できません

だから誰も私が刺し傷のリストのドロップダウンリストを埋めることができない理由を認めることができますか?ありがとう

15
john Gu

DropDownListaccept文字列のリストではないためです。 IEnumerable<SelectListItem>。文字列のリストをそれに変換するのはあなたの責任です。ただし、これは非常に簡単です。

domains.Select(m => new SelectListItem { Text = m, Value = m })

次に、それをDropDownListにフィードできます。

@Html.DropDownList("domains", ((List<string>)ViewBag.domains).Select(m => new SelectListItem { Text = m, Value = m }))
29
Chris Pratt

ViewBagは強く型付けされていません。ビューが複数のデータソースを利用できるように、ViewModelクラスを使用してインスタンスを表示に渡すことができます。

    public ActionResult Login(string returnUrl)
    {
        List<string> domains = new List<string>();
        domains.Add("DomainA");

        ViewModel model=new ViewModel();
        model.ReturnUrl = returnUrl;
        model.Domains =new SelectList(domains);
        return View(model);
    }

    Public Class ViewModel()
    {
        property Url ReturnUrl{get;set;}
        property SelectList Domains{get;set;}
    }
4
Thanigainathan

Chris Prattの答えを完成させるために、ドロップダウンを作成するサンプルコードを以下に示します。

@Html.DropDownList("domains", new SelectList(((List<string>)ViewBag.domains).Select(d => new SelectListItem { Text = d, Value = d }), "Value", "Text"))

これにより、次のマークアップが生成されます。

<select id="domains" name="domains">
    <option value="item 1">item 1</option>
    <option value="item 2">item 2</option>
    <option value="item 3">item 3</option>
</select>
4
dom
@Html.DropDownListFor(
     m => m.Country, 
          new SelectList(_CountryList, "CountryID", "Title"),
          new { @class = "form-control" }
)
0
user6683041

各名前を_IEnumerable<SelectListItem>_に変換する必要があるため、値ごとに「キー」またはインデックスが必要です。これには、表示するID値とテキスト文字列が必要です。次の2つの方法のいずれかを使用して、それを行うことができます。

辞書を使用

_Dictionary<int, string>_を作成します。

_Dictionary<int, string> domainDict = new Dictionary<int, string>();
_

ドメインを追加するたびに、番号を追加します。

_domainDict.Add(1, "DomainA");
_

複数のドメインでこの情報のソースリストがある場合は、そのリストでforeachを実行し、アイテムを手動で追加する代わりに、以下に示すようなインデクサー変数を使用できます。

モデルが必要になります。 _DomainViewModel.cs_というクラスを作成し、内部に追加します:

_public class DomainViewModel()
{
    public int Id { get; set; }
    public string Name { get; set; }
}
_

次に、辞書を反復してDomainViewModelに項目を追加し、次のセクションで次に示すように、これらの各項目を_List<DomainViewModel>_に追加します。ただし、次のようになります。

_List<DomainViewModel> lstDomainModel = new List<DomainViewModel>();

foreach(KeyValuePair<int, string> kvp in domainDict)
{
    DomainViewModel d = new DomainViewModel();
    d.Id = kvp.Key;  // number 
    d.Name = kvp.Value;  // domain name
    lstDomainModel.Add(d);
}
_

仕上げにスキップ)

ループインデクサーによる反復のリスト

_Dictionary<>_を使用したくない場合は、_List<string>_を繰り返して_List<DomainViewModel>_に直接配置することで、インデックスをその場で追加できます。その方法は次のとおりです。

1)上から_DomainViewModel.cs_クラスを作成したことを確認してください。

2)コントローラー関数を編集して_List<string>_を構築し、それを反復処理して、インデクサー変数(DomainViewModel)を使用して、idxのチャンクで新しい_List<DomainViewModel>_に追加します。

_List<string> domains = new List<string>();
domains.Add("DomainA");  // etc.

List<DomainViewModel> lstDomainModel = new List<lstDomainModel>();
int idx = 0;

// Add your List<string> to your List<DomainViewModel>
foreach (string s in domainList)
{
    DomainViewModel domainModel = new DomainViewModel();
    domainModel.Id = idx;
    domainModel.Name = s;
    lstDomainModel.Add(domainModel);
    idx++;
}
_

仕上げ

いずれかの方法を使用して、_List<DomainViewModel>_に入れたら、次のようにできます。

_IEnumerable<SimpleListItem> domainList = 
    lstDomainModel.Select(d => new SelectListItem { 
            Text = d.Name, 
            Value = d.Id.ToString() 
        }
    );
ViewBag.Domains = domainList;
_

そして、次のようにビューに表示します:

_@Html.DropDownList("Domains", (IEnumerable<SelectListItem>)ViewBag.Domains)
_
0
vapcguy