我试图在表单中要求一个文本输入字段,这意味着表单中需要有一些内容。但是,向我的模型添加
[Required]
标签不起作用。具体来说,查看用户名属性:
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; }
}
这允许空字符串通过模型验证,并最终在尝试为用户名插入 NULL 值时引发数据库错误。
我如何更改这些属性,以便它们做它们看起来应该做的事情?
经过大量谷歌搜索和 Stackoverflow 查找后,我一无所获。
我去了 MSDN,查看了 System.ComponentModel.DataAnnotations 命名空间。
在那里,我更仔细地查看了
Required
属性,并注意到了 AllowEmptyStrings
属性。将其设置为 false
告诉该属性不允许任何空字符串。至少在某些版本中,这是默认行为,这是有道理的,因为 Required
的要点是要求输入某些内容,而空字符串表示未输入任何内容。如果它是默认值,您可能不需要添加它,但明确说明也没有什么坏处。
但这并不能解决问题,因为默认情况下空字符串被强制转换为
null
,它不是空字符串,因此是允许的。这看起来很荒谬,因为 Required
应该测试是否输入了某些内容,而 null
则表示没有输入任何内容。但是,AllowEmptyStrings
页面有一个指向 DisplayFormAttribute
的属性 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; }
}
我会实现一个像这样的新验证属性并将其应用到我的模型中。
public class RequiredNotEmptyAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
if(value is string) return !String.IsNullOrEmpty((string)value);
return base.IsValid(value);
}
}
这只适用于服务器端(客户端仍然只检查 null)。