2

私は MVC プロジェクトに取り組んでいます。オプション ラベル「タスクの選択」が付いたドロップダウン リストを持つビューがあります。現在、このドロップダウンにバインドされている整数プロパティは必須フィールドではありません。

しかし、保存しようとすると、必要であることを示す赤い境界線を持つドロップダウンが表示されます。分析したところ、オプション ラベルの値が null であることがわかりました。

オプション ラベルの値に 0 を入力したときに firebug を使用すると、ビューはモデル ステート エラーなしで保存されました。私は何か間違っていますか?それを避ける方法は?

View 

@Html.DropDownListFor(model => model.projecttaskid, new SelectList((IList<SelectListItem>)ViewData["MyTasks"], "Value", "Text"),"Select Task", new { @class = "span2" })

Model public int projecttaskid { get; set; }コントローラー コントローラーアクションには至りません。

4

3 に答える 3

0

瞬時にDropDownListForoptionLabel引数でのオーバーロードを使用します (「タスクの選択」引数.

アイテムが選択されていない場合、これは「選択されたオプション」と見なされ、 に対して null 値が返されますmodel.projecttaskid

0最も簡単な方法は、リストを作成するときに値を持つ要素を追加することです ( ViewData["MyTasks"])

たとえば、次のようにします。

Value = 0;
Text = "Select Task;

そして、optionLabel なしで DropDownListFor のオーバーロードを使用します。

[ちなみに、ViewData の代わりに ViewModels を使用するのは良いことですが、それは別の問題です]

*編集*

これらのケースを管理するために、いくつかの拡張メソッドを使用します。

public static IEnumerable<SelectListItem> ToSelectListItem<T, TValue, TText>(
            this IEnumerable<T> enumerable,
            Func<T, TText> text,
            Func<T, TValue> value)
        {
            return enumerable.Select(item => new SelectListItem
            {
                Text = text(item).ToString(),
                Value = value(item).ToString()
            }).AsEnumerable();
        }

public static IEnumerable<SelectListItem> WithDefaultZeroValue(this IEnumerable<SelectListItem> selectListItems, string chooseText/* = ChooseText*/)
        {
            IList<SelectListItem> items = selectListItems.ToList();
            items.Insert(0, new SelectListItem { Value = "0", Text = chooseText });

            return items.AsEnumerable();
        }

利用方法

var myList = mySourceForDropDown.ToSelectListItem(m => m.TextField, m => m.ValueField)
                                .WithDefaultZeroValue("SelectTask")
于 2013-05-23T13:49:36.367 に答える
0

projecttaskidnull可能ではありません。ドロップダウン リストにデフォルト値を指定しないと、モデルが正しくバインドされないため、モデル フィールドが としてマークされていなくても検証エラーが発生します[required]

編集: デフォルト値では、デフォルト値が 0 であるため、リスト内の値が 0 の項目を意味しますprojecttaskid

于 2013-05-23T14:03:35.303 に答える