MVC DataAnnotation 不接受空格

Posted

技术标签:

【中文标题】MVC DataAnnotation 不接受空格【英文标题】:MVC DataAnnotation Accept No Spaces 【发布时间】:2014-12-26 19:58:56 【问题描述】:

我正在 MVC5 中开发登录视图。

我想在 ViewModel 级别设置一个 DataAnnotation 来声明该字段不接受空格。

MVC 中是否有数据注释(类似于 [NoSpaces] 可用于不允许字符串字段包含“空格”?

【问题讨论】:

您需要正则表达式验证器。 msdn.microsoft.com/en-us/library/… 我很擅长正则表达式,但是这个验证器是你需要的。 好的...请问您是否要求关闭此问题? 不是我要求关闭问题的。 【参考方案1】:

这个怎么样:

[RegularExpression(@"^\S*$", ErrorMessage = "No white space allowed")]

【讨论】:

...这将允许除空格以外的任何字符,对吗? 来自 msdn - 匹配任何非空白字符。 如果您发现自己在多个地方使用这样的 DataAnnotation,可以很方便地创建一个继承自 RegularExpressionAttribute 的自定义类,并且只有一个空的构造函数将您正在使用的参数传递到基础构造函数。 这个很贵,不遵循DRY。还有一种更高效的方式。检查我的答案。【参考方案2】:

嗯,我能想到的最简单但可靠的方法是查看现有代码的工作方式,或者现有数据注释的工作方式。

System.ComponentModel.DataAnnotations.StringLengthAttribute类为例。

这里只是定义(只是为了保持简短):

namespace System.ComponentModel.DataAnnotations

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class StringLengthAttribute : ValidationAttribute
    
        public StringLengthAttribute(int maximumLength);

        public int MinimumLength  get; set; 

        public override string FormatErrorMessage(string name);
       
        public override bool IsValid(object value);
    

所以我只需从GitHub 复制原始实现源代码并根据我的需要对其进行自定义。例如,要获得这样的签名(如果我理解正确并且这就是您想要的):

public StringLengthAttribute(int maximumLength, int minLength = 0, allowEmptySpaces = true);

如需更深入的信息,我还将阅读有关 ValidationAttribute 类的 Microsoft 文档,该类是自定义验证数据注释的基类。

编辑:

我会在我只需要排除空字符串或仅包含空格的字符串的情况下依赖正则表达式来验证数据,因为正则表达式非常昂贵 进行处理(并且需要大量内存分配,因为表达式编译器、状态机等)。

【讨论】:

【参考方案3】:

如果这对任何人都方便,我可以通过在客户端上执行此操作来解决此问题:

//修剪每个表单输入

var $form = $("#myForm");
$form.find("input:text").each(function()
   var $self= $(this);
   $self.va($self.val().trim());
);

//然后在提交前验证

if($form.valid()) $form.submit(); 

// 服务器上的ModelState.Isvalid 确实使用[Required] 验证每个项目,并且不会只接受输入中的空格(但这意味着额外往返服务器,并不总是很方便)

【讨论】:

这不是在客户端执行此操作的好习惯。只要您控制客户端,它就可以正常工作,但是如果有人以不同的方式发送 e 请求,您的服务器甚至不会处理这种情况。服务器应该始终执行该检查..

以上是关于MVC DataAnnotation 不接受空格的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器

EmailAddress DataAnnotation 在 View 上标记为有效但 ModelState.IsValid = false?

怎样避免在EF自己主动生成的model中的DataAnnotation被覆盖掉

DataAnnotation 不显示存储在 ViewModel 中的数据

MVC 验证的单元测试

DataAnnotation 正则表达式问题