0

モデルに次のプロパティがあります。

    [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を有効にすると正常に動作するのに、サーバー側で失敗するのはなぜですか?

4

1 に答える 1

3

ViewBag.NumbersPOSTアクションでは、ビューを返す前にGETアクションで行ったのと同じ方法で、プロパティを再入力することを忘れないでください。

[HttpPost]
public ActionResult SomeAction(MyViewModel model)
{
    // some processing ...

    // now repopulate the ViewBag if you intend to return the same view
    ViewBag.Numbers = numbers
        .Select(n => new SelectListItem { 
            Text = n.Number.ToString(), 
            Value = n.Number.ToString() 
        })
        .ToList();

    return View(model);
}
于 2012-09-18T10:59:09.127 に答える