空字符串的表单验证

3

如何使表单中的名字输入框不接受空格字符" "作为有效输入?

    <form asp-action="SaveRegistration" autocomplete="off">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="FirstName" class="control-label"></label>
            <input asp-for="FirstName" class="form-control" />
            <span asp-validation-for="FirstName" class="text-danger"></span>
        </div>

型号:

public class ContactInfo
{
    [Required(ErrorMessage = "This field is required")]
    [StringLength(50)]
    [DisplayName("First name")]
    public string FirstName { get; set; }
}

使用 [Required] 属性,用户仍然可以提交一个只包含空格字符 " " 的字符串。

我知道这是一个简单的问题,但我是ASP.NET MVC的新手。


你知道吗,你可以使用[StringLength],那么是什么阻止你使用@Html.TextBoxFor()呢? - Bagus Tesa
尝试使用此链接:https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.minlengthattribute(v=vs.110).aspx - Bola
@BagusTesa 我已经在使用StringLength了。Html.TextBoxFor比<input asp-for="FirstName"更好在哪里? - Don Box
@Bola MinLength 是如何帮助的?我想防止用户输入仅由空格字符组成的字符串,但我不想限制最小长度。 - Don Box
[Required(AllowEmptyStrings = false)] - 这个行得通吗?听起来你可以编写自定义的 RequiredAttribute 并进行 IsNullOrWhiteSpace 检查。 - Tetsuya Yamamoto
显示剩余2条评论
5个回答

7

使用方法:

[NotNullOrWhiteSpaceValidator]
public string FirstName { get; set; }

如何创建自己的属性:

using System;
using System.ComponentModel.DataAnnotations;

public class NotNullOrWhiteSpaceValidatorAttribute : ValidationAttribute
{
    public NotNullOrWhiteSpaceValidatorAttribute() : base("Invalid Field") { }
    public NotNullOrWhiteSpaceValidatorAttribute(string Message) : base(Message) { }

    public override bool IsValid(object value)
    {
        if (value == null) return false;

        if (string.IsNullOrWhiteSpace(value.ToString())) return false;

        return true;        
    }

    protected override ValidationResult IsValid(Object value, ValidationContext validationContext)
    {
        if (IsValid(value)) return ValidationResult.Success;
        return new ValidationResult("Value cannot be empty or white space.");
    }
}

这里是一堆更多验证器的实现代码:数字、电子邮件等:https://github.com/srkirkland/DataAnnotationsExtensions/tree/master/DataAnnotationsExtensions


谢谢!这是服务器端验证,对吗?表单需要提交才能启动验证。 - Don Box
1
正确的做法是,很多人会添加客户端JavaScript验证,但你应该始终有服务器端验证,以防止客户端浏览器(如Chrome甚至Nintendo Wii)禁用JavaScript。通常,验证方法将通过控制器中的 if (Model.IsValid) 调用。还可以在管道早期调用这些验证。 - Jeremy Thompson

2
您可以始终使用正则表达式。
例如:
[RegularExpression(@".*\S+.*$", ErrorMessage = "Field Cannot be Blank Or Whitespace"))]
public string FirstName { get; set; }

@SBFrancies 我会将您的评论标记为答案,但是我正在寻找比RegExp更好的解决方案。这可以通过使用ViewState.IsValid或进行自定义客户端验证来避免。 - Don Box
我仍在寻找另一种方式。 - Don Box
@DonBox 你能不能在提交之前在服务器端验证if(!String.IsNullOrEmpty(FirstName)),如果你也想要一个服务器端的解决方案? - clamchoda
@JeremyThompson 这个问题在于用户还想将纯空格字符串标记为无效,而不仅仅是空字符串。 - SBFrancies
嗯-好的,那我会重新打开。 - Jeremy Thompson
显示剩余10条评论

2

默认行为是拒绝空字符串。您可以通过将AllowEmptyStrings设置为true来更改此行为。文档

[Required(ErrorMessage = "This field is required")]

1

注意:这适用于 .net MVC 4+。

[Required(ErrorMessage = " is required.")]中有一个AllowEmptyStrings的实现。

如果允许空字符串,则此方法返回true;否则返回false。该方法的默认值设置为false。所以不用担心!测试并验证一下。它不应该允许单个或多个空字符串。如果没有明确将其设置为false,然后查看是否有效。

FYR`

public class RequiredAttribute : ValidationAttribute
    {
        //
        // Summary:
        //     Initializes a new instance of the 
           System.ComponentModel.DataAnnotations.RequiredAttribute
        //     class.
        public RequiredAttribute();

        //
        // Summary:
        //     Gets or sets a value that indicates whether an empty string is 
       // allowed.
        //
        // Returns:
        //     true if an empty string is allowed; otherwise, false. The default 
        // value is false.
        public bool AllowEmptyStrings { get; set; }

        //
        // Summary:
        //     Checks that the value of the required data field is not empty.
        //
        // Parameters:
        //   value:
        //     The data field value to validate.
        //
        // Returns:
        //     true if validation is successful; otherwise, false.
        //
        // Exceptions:
        //   T:System.ComponentModel.DataAnnotations.ValidationException:
        //     The data field value was null.
        public override bool IsValid(object value);
    }

}`


-1

第一

您可以尝试使用stringlength或minlength数据注释。

第二

您可以使用parsley.js

这是一个非常棒的客户端表单验证库。

我建议您同时使用客户端和服务器端验证。


字符串长度或最小长度并不能阻止空格的有效性。 - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接