自定义ValidationAttribute不返回本地化的ErrorMessage

德夫拉

我有一个SharedResource文件,其属性已翻译成4种语言。如果iban输入无效,我想返回本地化的ErrorMessage。

本地化适用于RequiredAttribute(从ValidationAttribute派生),但不适用于Ibanvalidator。

我在这里做错了什么?

模型

    [LocalizedDisplayName("RegisterFinancialStepViewModel_Iban_DisplayName", typeof(SharedResource))]
    [IbanValidation("ErrorMessage_Invalid_Iban")]
    [StringLength(50)]
    public string Iban { get; set; }

这也行不通

    [IbanValidation(ErrorMessage = "ErrorMessage_Invalid_Iban")]

IbanValidator类

    public static class IbanValidator
{
    public static bool Validate(string iban)
    {
        return string.IsNullOrEmpty(iban) || ValidateChecksum(iban.ToUpper());
    }

    private static bool ValidateChecksum(string iban)
    {
        if (iban.Length < 4 || iban[0] == ' ' || iban[1] == ' ' || iban[2] == ' ' || iban[3] == ' ')
            return false;

        var checksum = 0;
        var ibanLength = iban.Length;

        for (var charIndex = 0; charIndex < ibanLength; charIndex++)
        {
            if (iban[charIndex] == ' ') continue;

            int value;
            var c = iban[(charIndex + 4) % ibanLength];
            if (c >= '0' && c <= '9')
            {
                value = c - '0';
            }
            else if (c >= 'A' && c <= 'Z')
            {
                value = c - 'A';
                checksum = (checksum * 10 + value / 10 + 1) % 97;
                value %= 10;
            }
            else if (c >= 'a' && c <= 'z')
            {
                value = c - 'a';
                checksum = (checksum * 10 + value / 10 + 1) % 97;
                value %= 10;
            }
            else
            {
                return false;
            }

            checksum = (checksum * 10 + value) % 97;
        }

        return checksum == 1;
    }
}

public class IbanValidationAttribute : ValidationAttribute
{
    private readonly string _errorMessage;

    public IbanValidationAttribute(string errorMessage)
    {
        _errorMessage = errorMessage;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return IbanValidator.Validate(value as string)
            ? ValidationResult.Success
            : new ValidationResult(_errorMessage);
    }
}

用Required替换IbanValidator会给出本地化但没有验证

    [Required(ErrorMessage = "ErrorMessage_Invalid_Iban")]
瑞安

您可以ErrorMessageTranslationService手动创建一个本地化错误消息。

public class ErrorMessageTranslationService
{
    private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
    public ErrorMessageTranslationService(IStringLocalizer<SharedResource> sharedLocalizer)
    {
        _sharedLocalizer = sharedLocalizer;
    }

    public string GetLocalizedError(string errorKey)
    {
        return _sharedLocalizer[errorKey];
    }
}

并在启动时注册它ConfigureServices

services.AddSingleton<ErrorMessageTranslationService>();

然后以自定义方式致电服务 IbanValidationAttribute

public class IbanValidationAttribute : ValidationAttribute
{
    private readonly string _errorMessage;

    public IbanValidationAttribute(string errorMessage)
    {
        _errorMessage = errorMessage;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        ErrorMessageTranslationService errorTranslation = validationContext.GetService(typeof(ErrorMessageTranslationService)) as ErrorMessageTranslationService;

        return IbanValidator.Validate(value as string)
            ? ValidationResult.Success
            : new ValidationResult(errorTranslation.GetLocalizedError(_errorMessage));
    }
}

模型:

[IbanValidation("ErrorMessage_Invalid_Iban")]
[StringLength(50)]
public string Iban { get; set; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

自定义验证的本地化

SiriKit:自定义意图-本地化问题

自定义号码(价格)格式与本地化无关

无法本地化自定义键盘iOS

自定义keycloak登录主题的本地化

自定义Azure Pipelines构建任务的本地化

Struts 1自定义本地化

使用自定义的本地化资源进行构建

为自定义ASP.NET MVC ValidationAttribute设置默认的ErrorMessage

B2C 自定义策略中 RestAPI 错误响应的本地化消息

在自定义表格视图单元格中本地化按钮和标签[swift]

在Moment阿拉伯语本地化中自定义数值

故事板中设置的自定义类的本地化不起作用

ASP.NET Core自定义验证错误消息未本地化

使用Rails 5的Attributes API的本地化输入的自定义十进制类型

ASP.NET Core自定义验证属性本地化

如何命名自定义(重命名)Info.plist的本地化文件?

如何在wix和DTF中本地化自定义操作的错误消息?

如何在自定义渲染器中更改Timepicker的标题和本地化

FluentValidation自定义消息本地化不适用于When()条件

Laravel本地化,如何获得自定义语言的价值

以自定义语言本地化 devextreme dx-date-box Angular 2+

Asp.net核心Web API本地化DataAnnotation自定义属性

如何本地化Google自定义搜索控件的界面

QueryStringRequestCultureProvider 用于自定义语言的 Abp 样板本地化

如何本地化在 Hybris 的 trainingcore-items.xml 中创建的自定义类型?

dbContext不返回本地对象

Azure AD B2C 自定义策略的本地化显示 unicode 字符而不是实际字母

支持字符串资源的c#自定义属性不会加载本地化资源