数据注释验证属性中的string.Format

时间:2013-06-04 09:03:52

标签: c# asp.net-mvc model-binding

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

string.Format结果不是编译时常量,并且无法由编译器进行评估。属性值仅限于

  

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

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

  • 简单类型(bool,byte,char,short,int,long,float和double)
  • 字符串
  • 的System.Type
  • 枚举
  • object(对象类型的属性参数的参数必须是上述类型的一个常量值。)
  • 任何上述类型的一维阵列

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

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


public const string Required = " is required.";

答案 1 :(得分:2)

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

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

答案 2 :(得分: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。祝你好运!