web-dev-qa-db-ja.com

SelectListからのASP.NET MVCドロップダウンリスト

コントローラーで次のSelectListを構築しています。

var u = new NewUser();

u.UserTypeOptions = new SelectList(new List<SelectListItem>
{
    new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
    new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
    new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
});

return u;

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

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)

かなり簡単なドロップダウンリストである必要があるSelectListItemsの有効なセットを提供しているように見えますが、適切な値とテキストを含む有効な<option>リストを取得する代わりに、これを取得します:

<select data-val="true" data-val-range="A user type must be selected." data-val-range-max="2" data-val-range-min="1" data-val-required="The UserType field is required." id="UserType" name="UserType" class="input-validation-error">
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
</select>

何が得られますか?私が知る限り、これはうまくいくはずです。

41
MattW

SelectList自体のTextおよびValueであるフィールドの設定がありません。そのため、リスト内の各オブジェクトに対して.ToString()を実行します。 SelectListItemのリストであると考えることができますが、これを検出するには十分に賢いはずですが、そうではありません。

u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
        new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text", 1);

ところで、任意のタイプの配列のリストを使用することができます...そして、テキストと値として機能するプロパティの名前を設定するだけです。

このようにするのが良いと思う:

u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text");

-1アイテムを削除し、各アイテムの設定でtrue/falseを選択しました。

次に、ビューで:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one")

このように、「Select one」アイテムを設定し、SelectListで選択されたアイテムを1つも設定しない場合、UserTypeはnullになります(UserTypeint?である必要があります)。

SelectList項目の1つを選択済みとして設定する必要がある場合は、次を使用できます。

u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected);
69
Romias

かみそりでこれを試してください

@{
    var selectList = new SelectList(
        new List<SelectListItem>
        {
            new SelectListItem {Text = "Google", Value = "Google"},
            new SelectListItem {Text = "Other", Value = "Other"},
        }, "Value", "Text");
}

その後

@Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" })

または

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" })
14
VnDevil

これを試してみてください、ほんの一例です:

u.UserTypeOptions = new SelectList(new[]
    {
        new { ID="1", Name="name1" },
        new { ID="2", Name="name2" },
        new { ID="3", Name="name3" },
    }, "ID", "Name", 1);

または

u.UserTypeOptions = new SelectList(new List<SelectListItem>
    {
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
        new SelectListItem { Selected = false, Text = "Homeowner", Value = "2"},
        new SelectListItem { Selected = false, Text = "Contractor", Value = "3"},
    },"Value","Text");
1
Jaimin