我知道我不应该使用Viewbag,我应该使用Html.DropDowlListFor()
构建一个菜单,以便我可以添加绑定到模型成员的属性,但是,这将涉及相当广泛的代码重写....
我有一个带菜单的自定义控制器:
*。ASCX
<%: Html.DropDownList("CityIDs", new SelectList(ViewBag.cities, "Id", "Name"), "--Select--", new { style = "width:200px" })%>
<%= Html.ValidationMessage("CityIDs") %>
列表填充得很好,我可以默认为"--Select--"
的顶部项目
prbolem是我希望验证错误发生在任何不是来自viewbag的东西上......我怎么能实现这个呢?
答案 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)
{
...
两件事:
请注意,我直接从数据库中提取城市ID(当然,您需要的实际代码取决于您的具体实施方式)。但重要的是,ViewBag
只能在单个请求中存活,因此您无法在发布后在ViewBag
中查找它们。
尽管名称复数为CityIDs
,但使用DropDownList
帮助程序可确保只存在一个选定值。如果这实际上应该是多选,那么您需要使用ListBox
代替,并在此处更新此条件以考虑检查多个值。
答案 1 :(得分:0)
使用Text =“--Select--”和Value =“”填充顶部项目 这将为CityID发布一个空白值,并在ModelState中导致错误。