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

问题描述 投票:0回答:3

我试图在表单中要求一个文本输入字段,这意味着表单中需要有一些内容。但是,向我的模型添加

[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 值时引发数据库错误。

我如何更改这些属性,以便它们做它们看起来应该做的事情?

c# forms validation asp.net-mvc-4
3个回答
121
投票

经过大量谷歌搜索和 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; }
}    

10
投票

我会实现一个像这样的新验证属性并将其应用到我的模型中。

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

        return base.IsValid(value);
    }
}

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


6
投票

您可以使用

[MinLength(1)]
。请参阅此处msdn 文档

© www.soinside.com 2019 - 2024. All rights reserved.