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

DCS*_*non 26 c# forms validation asp.net-mvc-4

我试图在表单中要求一个文本输入字段,这意味着表单中需要有一些东西.但是,[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; }
}
Run Code Online (Sandbox Code Playgroud)

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

如何更改这些属性,以便他们执行他们应该执行的操作?

DCS*_*non 67

经过大量谷歌搜索并查看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; }
}    
Run Code Online (Sandbox Code Playgroud)

  • 我检查Assembly System.ComponentModel.DataAnnotations.dll,v4.0.0.0,我看到以下注释:public bool AllowEmptyStrings {get; 组; } //返回://如果允许空字符串,则为true; 否则,错误.默认值为false. - 那么问题出在哪里?默认值为false. (3认同)

fir*_*986 6

你可以使用[MinLength(1)]. 请参阅此处的 msdn 文档


Nat*_*n A 5

我将实现一个像这样的新验证属性并将其应用于我的模型.

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

        return base.IsValid(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

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