验证所选项目是下拉列表中的可能值

时间:2013-06-15 20:39:45

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

我有一个用于编辑用户设置的视图模型。其中一个属性定义为

<Display(Name:="View_User_Profile_Language", ResourceType:=GetType(Resources.UIText))>
Public Property Language As String

在视图中,我这样使用它:

<%: Html.LabelFor(Function(m) m.UserInfoForm.Language) %>
<%: Html.DropDownListFor(Function(m) m.UserInfoForm.Language,
                 languages.Select(Function(lang) New SelectListItem With {
                     .Text = New Globalization.CultureInfo(lang).NativeName,
                     .Value = lang,
                     .Selected = (Model.UserInfoForm.Language = lang)
                 }))%>
<%: Html.ValidationMessageFor(Function(m) m.UserInfoForm.Language)%>

其中languages是视图中定义的字符串列表,例如“en”,“fr”,“de”


问题是用户可以提交一个不在下拉列表中的值(例如使用javascript,inspect元素或不使用浏览器,例如fiddler)

如何验证所选项目,确保它存在于下拉列表中?

我了解<StringLength><Required>等验证属性,并在操作中使用If ModelState.IsValid Then。是否有一个现成的属性,说明验证器应该在哪里查找允许值列表?

感谢您阅读

1 个答案:

答案 0 :(得分:0)

要以自动验证的方式在服务器端进行此验证是不可能的,因为服务器必须记住帖子之间的下拉列表中的选项。下拉列表发送到html输出后,您将丢失可用的下拉列表数据。因此,您需要在服务器端重新创建可用选项以进行检查。

在我的项目中,我们倾向于对数据库内部的正确性进行此类检查。在此示例中,他们将尝试将值插入应由外键链接的字段中。在这个例子中,这个字段将是Language,并且是参考表LanugageAbbreviations的外键。由于所选值“zz”没有外键,因此数据库在尝试插入时应该失败。

如果你必须进一步推动验证,你可以随时检查下拉列表中的有效值,即。

 [HttpPost]
 public ActionResult Index(AnimalViewModel model){
     CheckLanguageDropDownList(model, ModelState)
     ... 
 }

其中CheckLanguageDropDownList是

 private void CheckLanguageDropDownList(WordsModel viewModel, ModelStateDictionary modelState)
 {
        HashSet<String> validValues = new HashSet<string>(dataLayer.LanugageAbbreviationsRefrenceTable.GetActiveValues());
        if !validValues.Contains(viewModel.Lanuage)
            modelState.AddModelError("Invalid Language ","The language selected is invalid");
 }

如果您需要这样做,请确保以有意义的方式进行重构。