web-dev-qa-db-ja.com

List <string>型のモデルを持つASP.NET MVC DropDownListFor

タイプがList<string>のモデルを持つビューがあり、リストのすべての文字列をドロップダウンのアイテムとして含むページにドロップダウンリストを配置したい。 MVCは初めてですが、これをどのように達成できますか?

私はこれを試しました:

@model List<string>
@Html.DropDownListFor(x => x)

しかし、それはエラーを投げました。

46
Chev

ドロップダウンリストを作成するには、2つのプロパティが必要です。

  1. バインドするプロパティ(通常、整数型または文字列型のスカラープロパティ)
  2. 2つのプロパティ(値用とテキスト用)を含むアイテムのリスト

あなたの場合、利用可能なドロップダウンリストを作成するために悪用できない文字列のリストしかありません。

番号2の場合、値とテキストを同じにすることができますが、バインドするプロパティが必要です。ヘルパーの弱い型付けバージョンを使用できます。

@model List<string>
@Html.DropDownList(
    "Foo", 
    new SelectList(
        Model.Select(x => new { Value = x, Text = x }),
        "Value",
        "Text"
    )
)

ここで、Fooはddlの名前であり、デフォルトのモデルバインダーによって使用されます。したがって、生成されたマークアップは次のようになります。

<select name="Foo" id="Foo">
    <option value="item 1">item 1</option>
    <option value="item 2">item 2</option>
    <option value="item 3">item 3</option>
    ...
</select>

これは、ドロップダウンリストのはるかに優れたビューモデルであると言われています。

public class MyListModel
{
    public string SelectedItemId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

その後:

@model MyListModel
@Html.DropDownListFor(
    x => x.SelectedItemId,
    new SelectList(Model.Items, "Value", "Text")
)

このリストでオプションを事前に選択したい場合、このビューモデルのSelectedItemIdプロパティをValueコレクションのいくつかの要素の対応するItemsに設定するだけです。

120
Darin Dimitrov

ドロップダウンリストに必要なタイプ文字列のリストがある場合、私は次のことを行います:

編集:より明確な例になりました。

public class ShipDirectory
{
    public string ShipDirectoryName { get; set; }
    public List<string> ShipNames { get; set; }
}

ShipDirectory myShipDirectory = new ShipDirectory()
{
    ShipDirectoryName = "Incomming Vessels",
    ShipNames = new List<string>(){"A", "A B", "A B C"},
}

myShipDirectory.ShipNames.Add("Aunt Bessy");

@Html.DropDownListFor(x => x.ShipNames, new SelectList(Model.ShipNames), "Select a Ship...", new { @style = "width:500px" })

次のようなドロップダウンリストが表示されます:

<select id="ShipNames" name="ShipNames" style="width:500px">
    <option value="">Select a Ship...</option>
    <option>A</option>
    <option>A B</option>
    <option>A B C</option>
</select>

コントローラーの投稿で値を取得するには;プロパティとして文字列のリストを持つモデル(MyViewModelなど)を使用している場合、x => x.ShipNamesを指定しているため、メソッドシグネチャを持っているだけです(モデル内でシリアル化/逆シリアル化されるため):

public ActionResult MyActionName(MyViewModelモデル)

投稿のドロップダウンリストにアクセスしたい場合、署名は次のようになります。

public ActionResult MyActionName(string ShipNames)

4
Paul Zahra

この質問はずっと前に聞かれたことに気づきましたが、答えを求めてここに来て、見つけられるものに満足していませんでした。私は最終的にここで答えを見つけました:

https://www.tutorialsteacher.com/mvc/htmlhelper-dropdownlist-dropdownlistfor

フォームから結果を取得するには、FormCollectionを使用し、モデル名ごとに個々の値を引き出します。

yourRecord.FieldName = Request.Form["FieldNameInModel"];

私が知る限り、FormCollectionにどの引数名を付けてもまったく違いはありません。Request.Form["NameFromModel"]を使用して取得します。

いいえ、カバーの下でth4eマジックがどのように機能するかを調べるために掘り下げませんでした。私はちょうどそれが機能することを知っています...

これが機能する前に、私がさまざまなアプローチを試すのに費やした時間を誰かが避けるのに役立つことを願っています。

0
DaveN59