如何使用数据注释属性类来失败表单中的空字符串?
我试图在表单中要求一个文本输入字段,这意味着表单中需要有一些东西。 但是,向我的模型添加[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; }