如何使用数据注释属性类来失败表单中的空字符串?

我试图在表单中要求一个文本输入字段,这意味着表单中需要有一些东西。 但是,向我的模型添加[Required]标记不起作用。 具体来说,查看User Name属性:

 public class ColumnWidthMetaData { [DisplayName("Column Name")] [Required] public string ColName { get; set; } [DisplayName("Primary Key")] public int pKey { get; set; } [DisplayName("User Name")] [Required] public string UserName { get; set; } [DisplayName("Column Width")] [Required] public int Width { get; set; } } 

这允许空字符串通过模型validation,并在尝试为用户名插入NULL值时最终引发数据库错误。

如何更改这些属性,以便他们执行他们应该做的事情?

经过很多谷歌搜索并查看Stackoverflow后,我什么都没有。

我去了MSDN并查看了System.ComponentModel.DataAnnotations命名空间 。

在那里,我更仔细地查看了Required属性,并注意到AllowEmptyStrings属性 。 将此设置为false告诉该属性不允许任何空字符串,我假设这是默认行为,看看Required点是如何要求输入内容,空字符串表示没有输入任何内容。

但这并没有解决问题,因为默认情况下空字符串被强制为null ,这不是空字符串,因此是允许的。 再次这是荒谬的,因为Required测试是否输入了某些内容,而null表示没有输入任何内容。 但是, AllowEmptyStrings页面有一个指向DisplayFormAttribute的Property ConvertEmptyStringsToNull的链接。 如果将此值设置为false ,则空字符串将保留为空字符串,然后所需的标记将不允许它们。

所以,这是修复:

 public class ColumnWidthMetaData { [DisplayName("Column Name")] [Required(AllowEmptyStrings=false)] [DisplayFormat(ConvertEmptyStringToNull=false)] public string ColName { get; set; } [DisplayName("Primary Key")] public int pKey { get; set; } [DisplayName("User Name")] [Required(AllowEmptyStrings=false)] [DisplayFormat(ConvertEmptyStringToNull=false)] public string UserName { get; set; } [DisplayName("Column Width")] [Required] public int Width { get; set; } } 

我将实现这样的新validation属性并将其应用于我的模型。

 public class RequiredNotEmptyAttribute : RequiredAttribute { public override bool IsValid(object value) { if(value is string) return String.IsNullOrEmpty((string)value); return base.IsValid(value); } } 

这只适用于服务器端(客户端仍然只检查null)。

您可以将DefaultValueAttribute添加到需要默认值的属性(例如,UserName的string.Empty)

 [DisplayName("User Name")] [System.ComponentModel.DefaultValue("")] public string UserName { get; set; }