C# 不允许下拉选择空值

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;

我正在使用MVC4应用程序。下面是我的模型

    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());
    // ....
}