我的目标很简单。我想在必需的错误消息中获得“显示名称”。所以我使用了字符串格式“ {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}的显示名称?
非常感谢
答案 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;
}
}
如果字符串包含字符串格式,我的意思是这个{},所以它将适用于字符串格式。我认为我的逻辑会起作用