需要使用Viewbag中的数据对html下拉列表进行验证

时间:2015-05-15 15:57:49

标签: html asp.net validation asp.net-mvc-4

我知道我不应该使用Viewbag,我应该使用Html.DropDowlListFor()构建一个菜单,以便我可以添加绑定到模型成员的属性,但是,这将涉及相当广泛的代码重写....

我有一个带菜单的自定义控制器:

*。ASCX

<%: Html.DropDownList("CityIDs", new SelectList(ViewBag.cities, "Id", "Name"), "--Select--", new { style = "width:200px" })%>
<%= Html.ValidationMessage("CityIDs") %>

列表填充得很好,我可以默认为"--Select--"的顶部项目 prbolem是我希望验证错误发生在任何不是来自viewbag的东西上......我怎么能实现这个呢?

2 个答案:

答案 0 :(得分:1)

下拉列表的验证仅确保发布了某些内容。如果您想确保发布的值实际上是一组&#34;允许的&#34;价值,然后您必须在后期操作中手动执行此操作:

var cityIds = db.Cities.Select(m => m.Id);
if (!cityIds.Contains(model.CityIDs))
{
    ModelState.AddModelError("CityIDs", "You must select one of the available choices.");
}

if (ModelState.IsValid)
{
    ...

两件事:

  1. 请注意,我直接从数据库中提取城市ID(当然,您需要的实际代码取决于您的具体实施方式)。但重要的是,ViewBag只能在单个请求中存活,因此您无法在发布后在ViewBag中查找它们。

  2. 尽管名称复数为CityIDs,但使用DropDownList帮助程序可确保只存在一个选定值。如果这实际上应该是多选,那么您需要使用ListBox代替,并在此处更新此条件以考虑检查多个值。

答案 1 :(得分:0)

使用Text =“--Select--”和Value =“”填充顶部项目 这将为CityID发布一个空白值,并在ModelState中导致错误。