我正在使用MVC4应用程序。以下是我的模特
public class ViewModel
{
public string AssignedUserName { get; set; }
public IList<SelectListItem> PossibleAssignees { get; set; }
[Required]
public string Comment { get; set; }
}
查看:
<table style="width: 100%; ">
<tr>
<td>Assigned To:</td>
<td>@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees)</td>
<td>@Html.ValidationMessageFor(m => m.AssignedUserName, "Assigned To Required")</td>
<tr></table>
PossibleAssignes是一个下拉列表,值应为 - &gt; EmptyString,&#34; Mr.Barr&#34;。
因此,如果用户选择了EmptyString,则意味着我需要抛出类似&#34;它是必需的&#34;领域。
我尝试添加 [必需] 字段验证程序。它是一个集合,它有一些空字符串值作为下拉值, 所以我不知道如何使用 [必需] 字段进行具有空字符串的集合。 我不想让空字符串下拉。
我该如何验证?
答案 0 :(得分:2)
不要为列表中的值指定一个emtpty字符串,而是将其用作默认值,[Required]
将正常工作。
在您的视图中,将其用作:
@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees, String.Empty)
并在您的viewmodel中:
public class ViewModel
{
[Required]
public string AssignedUserName { get; set; }
public IList<SelectListItem> PossibleAssignees { get; set; }
[Required]
public string Comment { get; set; }
}
编辑(我会留下我的第一个答案,因为它可能适用于其他人)
您可以进行自定义验证:
public class ViewModel
{
[Required]
[ValidateAssignedUserName()]
public string AssignedUserName { get; set; }
public IList<SelectListItem> PossibleAssignees { get; set; }
[Required]
public string Comment { get; set; }
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class ValidateAssignedUserName : ValidationAttribute
{
private const string _defaultErrorMessage = "Select a user.";
public ValidateAssignedUserName()
: base(_defaultErrorMessage)
{ }
public override bool IsValid(object value)
{
string user = value as string;
if (user != null && user.Length > 0)
{
return true;
}
return false;
}
}
答案 1 :(得分:1)
或者,您也可以使用自定义模型绑定器.e.g
public class ViewModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var model = base.BindModel(controllerContext, bindingContext) as ViewModel;
if (model.AssignedUserName == "-1")
bindingContext.ModelState.AddModelError("AssignedUserName", "No assignee selected");
return model;
}
}
<强>的Global.asax.cs 强>
protected void Application_Start()
{
// .....
ModelBinders.Binders.Add(typeof(ViewModel), new ViewModelBinder());
// ....
}
略微更改您的观点:
<td>@Html.ValidationMessageFor(m => m.AssignedUserName)</td>
从上面一行的第二个参数中删除文本。
执行上述操作会导致ModelState.IsValid
设置为false
。在渲染视图时,文本&#34;没有选择受理人&#34;将显示ValidationMessageFor()
来电的位置。
因此可以选择实现您的需求。