モデルに次のプロパティがあります。
[Required]
[Range(1, int.MaxValue, ErrorMessage = "Bad number")]
public virtual int Number { get; set; }
私はそれをコントローラーに記入しています:
List<SelectListItem> items = new List<SelectListItem>();
// numbers is just a list with entities with an integer field Number
items.AddRange(numbers.
Select(n => new SelectListItem() { Text = n.Number.ToString(), Value = n.Number.ToString() })
.ToArray());
ViewBag.Numbers = items;
そして私の見解では、私は次のことをしています:
@Html.DropDownListFor(m => m.Number, ViewBag.Numbers as IEnumerable<SelectListItem>, "Select a number")
@Html.ValidationMessageFor(m => m.Number)
Javascriptが有効になっている場合は、正常に機能しているようです。最初の項目(「番号を選択」が空)を選択すると、必須のバリデーターが起動し、POSTが許可されません。
しかし、Javascriptを無効にすると、そのDropDownListForメソッド呼び出しのビューで例外が発生します。
The ViewData item that has the key 'Number' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.
[範囲]をコメントアウトすると、そのような例外はありませんが、必須は機能しないようです。空の「数値を選択」オプション(value = ""があります)をPOSTすると、モデルは検証に合格します。しかし、そうすべきではありません-空の文字列は有効な整数ではありません!Javascriptを有効にすると正常に動作するのに、サーバー側で失敗するのはなぜですか?