我有一个用于编辑用户设置的视图模型。其中一个属性定义为
<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
。是否有一个现成的属性,说明验证器应该在哪里查找允许值列表?
感谢您阅读
答案 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");
}
如果您需要这样做,请确保以有意义的方式进行重构。