带有本地化

时间:2019-11-29 17:21:30

标签: asp.net-core

我的目标很简单。我想在必需的错误消息中获得“显示名称”。所以我使用了字符串格式“ {0}” 示例:sqlLocalization

[必填(ErrorMessage =“ {0}字段为必填。”)]

public class AttributeField
    {
       [Display(Name = "AttributeFeatureCode")]
       [Required(ErrorMessage = "The {0} field is required.")]
       public string AttributeFeatureCode { get; set; }
       ...
    }

结果:必填字段为必填

data-val-required="The {0} field is required"

所以我在网上进行了研究,发现GetErrorMessage上有错误

我猜这里有些问题...而且我必须在我的项目上写重写。

public class RequiredAttributeAdapter : AttributeAdapterBase<RequiredAttribute>
    {
        public RequiredAttributeAdapter(RequiredAttribute attribute, IStringLocalizer stringLocalizer): base(attribute, stringLocalizer)
        {
        }
        public override void AddValidation(ClientModelValidationContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            MergeAttribute(context.Attributes, "data-val", "true");
            MergeAttribute(context.Attributes, "data-val-required", GetErrorMessage(context));
        }
        public override string GetErrorMessage(ModelValidationContextBase validationContext)
        {
            if (validationContext == null)
            {
                throw new ArgumentNullException(nameof(validationContext));
            }
            var errorMessage = GetErrorMessage(validationContext.ModelMetadata);
            return string.Format(errorMessage, validationContext.ModelMetadata.GetDisplayName());
        }
    }

当我像这样使用它时

return GetErrorMessage(validationContext.ModelMetadata, validationContext.ModelMetadata.GetDisplayName());

结果为必填字段{0}

如果我使用替代更改它,则可以正常运行

var errorMessage = GetErrorMessage(validationContext.ModelMetadata);
return string.Format(errorMessage, validationContext.ModelMetadata.GetDisplayName());

您怎么看? GetErrorMessage是否有任何错误?

为什么我可以得到{0}?和

为什么我无法获得{0}的显示名称?

非常感谢

1 个答案:

答案 0 :(得分:0)

SqlStringLocalizer.cs and line 40上有问题

所以我改变了

public LocalizedString this[string name, params object[] arguments]
        {
            get
            {
                var str = this[name];
                if (arguments.Length > 0)
                    str = this[string.Format(str, arguments.Select(x => x.ToString()).ToArray())];
                return str;
            }
        }

如果字符串包含字符串格式,我的意思是这个{},所以它将适用于字符串格式。我认为我的逻辑会起作用