2

有没有办法使用格式化字符串而不是直接常量来设置数据注释消息,

我需要像下面的代码一样设置必填字段 ErrorMessage,但它给了我一个错误。

[Required(ErrorMessage = string.Format(SystemMessages.Required, "First Name"))]
public string FirstName { get; set; }

SystemMessages是一个常量文件,它有以下代码,

public const string Required = "{0} is required.";

有没有办法设置这样的属性?

4

3 回答 3

4

string.Format结果不是编译时间常数,编译器无法评估。属性值仅限于

属性参数类型的常量表达式、typeof 表达式或数组创建表达式。

更正式地,您可以在msdn找到限制描述。格式化字符串不适合其中任何一个,它们是:

  • 简单类型(bool、byte、char、short、int、long、float 和 double)
  • 细绳
  • 系统类型
  • 枚举
  • 对象(对象类型的属性参数的参数必须是上述类型之一的常量值。)
  • 上述任何类型的一维数组

充其量你可以尝试类似的东西:

[Required(ErrorMessage = "First Name" + Required)]
public string FirstName { get; set; }


public const string Required = " is required.";
于 2013-06-04T09:10:03.803 回答
2

DisplayAttribute如果要输出显示名称而不是属性名称,只需使用:

[Required]
[Display(Name = "First Name")]
public string FirstName { get; set; }
于 2013-06-04T09:12:08.083 回答
2

请实施IValidatableObject哪种使用Validate方法。它看起来像:

  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  {
       var memberNames = new List<string>();
       if (string.IsNullOrEmpty(this.FirstName )
        {
            memberNames.Add("FirstName");
            yield return new ValidationResult(string.Format(Resources.Required, "First Name"), memberNames);
        }
  }

如果不清楚,请阅读IValidatableObject。祝你好运!

于 2013-06-04T09:19:07.273 回答