0

同じページの他の人とは異なり、動作しないnull許容の列挙型があります。列挙型がTitleあります。拡張メソッドを使用すると、ページのドロップダウンリストにデータを入力するのに役立ちます。ViewBag宣言は次のようになります。

ViewBag.TitleList = EnumExtensions.ToSelectList<Title>("[select]");

さて、誰かが私にそれを説明するかもしれませんが、MVCでのバインディングに関してはここで黒魔術が起こります。呼び出し時にページが無効である場合if(ModelState.IsValid)、画面を再レンダリングすると、上記のステートメントが再度呼び出されます。ただし、今回は正しいドロップダウン項目が選択されます(その時点で選択した項目によって異なります)。

深く掘り下げて、これはメソッド宣言です:

    public static SelectList ToSelectList<TEnum>(string nullEntry = null) where TEnum : struct
    {
        return ToSelectList<TEnum>(nullEntry, null);
    }


    public static SelectList ToSelectList<TEnum>(string nullEntry = null, string selectedValue = null) where TEnum : struct
    {
        var enumType = typeof(TEnum);
        var values = Enum.GetValues(enumType).OfType<TEnum>();
        List<SelectListItem> items =  ToSelectList<TEnum>(values, nullEntry, selectedValue);
        SelectList sl = new SelectList(items, "Value", "Text", selectedValue);
        return sl;
    }

    public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, string nullEntry, string selectedValue = null)
    {
        List<SelectListItem> items;

        if ((typeof(T).IsEnum))
        {
            items = enumerable.Select(f => new SelectListItem()
            {
                Text = f.GetDescription(),
                Value = f.ToString(),
                Selected = f.ToString() == selectedValue
            }).ToList();
        }
        else
        {
            items = enumerable.Select(f => new SelectListItem()
            {
                Text = f.ToString(),
                Value = f.ToString()
            }).ToList();
        }

        if (!string.IsNullOrEmpty(nullEntry))
        {
            items.Insert(0, new SelectListItem() { Text = nullEntry, Value = "" });
        }

        return items;
    }

ランダムなケースを処理するためのオーバーロードがいくつかありますが、おそらくこれらのいくつかは必要ありません。

私が言ったように、他の列挙には正しいアイテムが選択されますが、この特定のアイテム、タイトルについては選択されません。列挙型宣言は次のとおりです。

public enum Title
{
    Mr,
    Miss,
    Mrs,
    Ms
}

そして最後にDropDownListFor、ページ自体で使用する宣言。

@Html.DropDownListFor(x => x.Title, (SelectList)ViewBag.TitleList)

問題は、最初にページにアクセスしたときに、選択されたアイテムが常に「[select]」であるということです(モデルで指定された列挙値がnullの場合)。ただし、モデルプロパティにはTitle 必ずSelectedItemが設定されており、ドロップダウンリストにもプロパティが設定されていますが、画面上ではデフォルトで「[select]」に設定されています。これは予期しないことです。

何か案は?

4

2 に答える 2

1

名前のせいTitleでしょうか?見ているだけで別の名前に変更してみてください。

于 2012-10-08T10:22:44.257 に答える
0

ドロップダウンリストがデフォルトで空白になるように、String.Emptyを追加してみてください。

@ Html.DropDownListFor(x => x.Title、(SelectList)ViewBag.TitleList、String.Empty)

于 2016-12-02T16:13:14.667 に答える