ASP.NET Core 2.2 Razor Pages - IP 地址的用户输入验证

ASP.NET Core 2.2 Razor Pages - User Input Validation for IP Address

我正在努力寻找一个示例或解决方案来验证用户在 Razor 页面表单控件上输入的 IP 地址。

输入的 IP 地址可以是任何值,但我只想check/verify输入的格式是否正确,即通常检查是否有太多数字、超出 .254 的八位字节范围不正确等。

我假设会有一个内置的验证属性,我可以将其添加到模型中 Class 但不确定这是否需要添加 NuGet。

如果我错了请纠正我,但假设验证此服务器端可能是更好的解决方案并减少长 运行 中的代码。但考虑到这更多只是为了确保正确的用户输入而不是安全功能,所以我很乐意探索所有途径,在此先感谢...

型号Class:

 [Required]
 [Display(Name = "IP Address")]
 public string IpAddress { get; set; }

剃刀页面:

 <div class="form-group">
            <label asp-for="ConnectorModel.IpAddress" class="control-label"></label>
            <input asp-for="ConnectorModel.IpAddress" class="form-control" />
            <span asp-validation-for="ConnectorModel.IpAddress" class="text-danger"></span>
        </div>

在 .NET Core 中,您可以简单地创建一个继承自 ValidationAttribute 的 class。您可以在 this doc 中查看完整的详细信息。

根据您的要求,您可以创建如下属性:

public class IPAddressAttribute : ValidationAttribute
{

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        YourViewModel yourviewmodel = (YourViewModel)validationContext.ObjectInstance;

        const string regexPattern = @"^([\d]{1,3}\.){3}[\d]{1,3}$";
        var regex = new Regex(regexPattern);
        if (string.IsNullOrEmpty(yourviewmodel.IpAddress))
        {
            return new ValidationResult("IP address  is null");
        }
        if (!regex.IsMatch(yourviewmodel.IpAddress )|| yourviewmodel.IpAddress.Split('.').SingleOrDefault(s => int.Parse(s) > 255)!=null)
        return new ValidationResult("Invalid IP Address");


        return ValidationResult.Success;
    }
}

并且在您的视图模型中使用如下:

[IPAddressAttribute]
[Display(Name = "IP Address")]
public string IpAddress { get; set; }

经过进一步测试,我发现我只能将上述解决方案用于单个视图模型实例,但是我的应用程序需要跨多个页面进行用户输入验证。通过反复试验,我发现按照下面更改代码允许我在多个剃须刀页面上使用相同的验证属性 class。感谢 Nan 帮助我找到最终解决方案。

查看模型:

 [Required]
 [IPAddressAttribute] // This calls the custom validation attribute class
 [StringLength(15)] // No need for a message, custom attribute handles this.
 [Display(Name = "IP Address")]
 public string IpAddress { get; set; }

验证属性Class:

public class IPAddressAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string IpAddress = (string)value;

        const string regexPattern = @"^([\d]{1,3}\.){3}[\d]{1,3}$";
        var regex = new Regex(regexPattern);
        if (string.IsNullOrEmpty(IpAddress))
        {
            return new ValidationResult("IP address  is null");
        }
        if (!regex.IsMatch(IpAddress) || IpAddress.Split('.').SingleOrDefault(s => int.Parse(s) > 255) != null)
            return new ValidationResult("Invalid IP Address");

        return ValidationResult.Success;
    }
}