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,它似乎工作正常 - 当我选择第一项(它是空的“选择一个数字”)时,必需的验证器会启动并且不允许发布。

但是,当我禁用 Javascript 时,我在该 DropDownListFor 方法调用上的视图中出现异常:

The ViewData item that has the key 'Number' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'. 

当我注释掉 [Range] 时,没有这样的异常,但似乎Required 不起作用-我可以发布空的“选择一个数字”选项(它具有 value="")并且我的模型通过了验证,但它不应该 - 空字符串不是有效的整数!为什么它在启用 Javascript 的情况下工作正常,但在服务器端失败?

4

1 回答 1

3

在您的 POST 操作中,不要忘记重新填充ViewBag.Numbers属性,就像您在返回视图之前在 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 回答