C# 不允许下拉选择空值
我正在使用MVC4应用程序。下面是我的模型C# 不允许下拉选择空值,c#,jquery,asp.net-mvc,asp.net-mvc-4,C#,Jquery,Asp.net Mvc,Asp.net Mvc 4,我正在使用MVC4应用程序。下面是我的模型 public class ViewModel { public string AssignedUserName { get; set; } public IList<SelectListItem> PossibleAssignees { get; set; } [Required] public string Comment { get; set;
public class ViewModel
{
public string AssignedUserName { get; set; }
public IList<SelectListItem> PossibleAssignees { get; set; }
[Required]
public string Comment { get; set; }
}
公共类视图模型
{
公共字符串AssignedUserName{get;set;}
公共IList可能签名者{get;set;}
[必需]
公共字符串注释{get;set;}
}
视图:
分配给:
@DropDownListFor(x=>x.AssignedUserName,Model.PossibleAssignees)
@Html.ValidationMessageFor(m=>m.AssignedUserName,“分配给所需的”)
possibleasignes是一个下拉列表,值应该是->清空字符串,“Barr先生”。
因此,如果用户选择EmptyString意味着我需要抛出验证,如“it is Required”字段
我尝试添加[必需]字段验证器。它是一个集合,具有一些空字符串值作为下拉值,
因此,我不确定如何使用[Required]字段进行具有空字符串的集合。
我不想让下拉列表使用空字符串
我如何验证它?不要将emtpty字符串指定给列表中的值,而是将其用作默认值,
[必需]
将正常工作。
在您看来,将其用作:
@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; }
}
公共类视图模型
{
[必需]
公共字符串AssignedUserName{get;set;}
公共IList可能签名者{get;set;}
[必需]
公共字符串注释{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;
}
}
公共类视图模型
{
[必需]
[ValidateAssignedUserName()]
公共字符串AssignedUserName{get;set;}
公共IList可能签名者{get;set;}
[必需]
公共字符串注释{get;set;}
}
[AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=true)]
公共密封类ValidateAssignedUserName:ValidationAttribute
{
私有常量字符串\u defaultErrorMessage=“选择一个用户。”;
public ValidateAssignedUserName()
:base(_defaultErrorMessage)
{ }
公共覆盖布尔值有效(对象值)
{
字符串用户=作为字符串的值;
if(user!=null&&user.Length>0)
{
返回true;
}
返回false;
}
}
或者,您也可以使用自定义模型活页夹
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());
// ....
}
稍微改变一下你的观点:
@Html.ValidationMessageFor(m=>m.AssignedUserName)
从第二个参数中删除上述行的文本
执行上述操作将导致ModelState.IsValid
设置为false
。呈现视图时,执行ValidationMessageFor()
调用的位置将显示文本“No assignee selected”
因此,有一些选项可以满足您的需要。显示如何在视图中生成下拉列表,
IList
@stephen更新了视图代码,如果您将其更改为@Html.DropDownListFor(x=>x.AssignedUserName,Model.possibleasignees,“--请选择--”)
它将使用空值呈现第一个选项,如果选择该选项,将触发验证错误。您还需要将[必需]
属性添加到属性AssignedUserName
@stephen它将在下拉菜单中添加“请选择”。对不起,我不想使用此选项。我无法理解将String.Empty添加到dropdown@SivaRajini在可能的情况下,签名者不包括空字符串。String.Empty
将作为默认值使用,并将来自远程服务的值作为nothing Selected进行验证。因此,它将被绑定model@SivaRajini您可以在“我的答案”的编辑部分进行自定义验证检查
protected void Application_Start()
{
// .....
ModelBinders.Binders.Add(typeof(ViewModel), new ViewModelBinder());
// ....
}