c# - 作为数据注释属性值的动态表达式

标签 c# validation asp.net-core asp.net-core-2.0 globalization

我有一个 ASP.NET Core 2 项目,我在其中使用注释来验证货币字段,如下所示:

public class Record {
    public const string CurrencyRegex = @"^[$]?\d+[,.]?\d?\d? ?[€$]?$";

[RegularExpression(Record.CurrencyRegex, ErrorMessage = "Invalid currency format")]
public string Budget { get; set; }

问题是小数分隔符 ([,.]?\d?\d?) 不完美。我需要对当前上下文文化敏感的表达。如果是 UK/US,小数分隔符应该被验证为 .,但是 id 在那里,比如 FR culture,小数点应该被认为是 ,

如果可能,如何使用“上下文相关常量”作为 RegularExpression 属性值?

最佳答案

这是不可能的。传递给属性的任何值都必须是编译时常量。但是 Thread.CurrentThread.CurrentCulture 或类似的是一个运行时变量。

您可以将 Budget 定义为 decimaldouble 并让 ModelBinder 使用当前区域性解析输入字符串。 (您必须在附加字段中传输货币符号。)

或者通过实现 IValidatableObject 来处理验证在模型上删除 [RegularExpression]:

using System.Globalization;
using System.Text.RegularExpressions;

public class Record : IValidatableObject {

     public string Budget { get; set; }

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {

        var currentDecimalSeparator =
            CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;

        // no need to espace literal dot '.' 
        // because it is used inside a character class '[.]'
        var currencyPattern = @"^[$]?\d+[" + currentDecimalSeparator + @"]?\d?\d? ?[€$]?$";

        if (!Regex.IsMatch(Budget, currencyPattern)) {
             yield return new ValidationResult(
                 $"Invalid currency format (use '{currentDecimalSeparator}' for decimal places).",
                 new[] { "Budget" }
             );
        }
     }
}

关于c# - 作为数据注释属性值的动态表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263403/

相关文章:

c# asp.net jQuery AJAX 从 MySQL 获取数据

jQuery 验证插件复选框 errorPlacement

c# - 如何在 ASP.NET Core 中实现复选框列表?

c# - SignalR,如何验证连接 ID 是否仍处于事件状态?

c# - 更改 Action 对象实例的参数

c# - ASP.NET Web 应用程序 session 问题

c# - 创建谷歌图表并转换为图像服务器端

validation - 帮助解决 HTML 验证错误 : Table column has no cells beginning in it

file - Struts2 - 文件选择字段值在验证错误时消失

asp.net - ASP.NET 核心中的无限重定向循环,同时强制执行 SSL