none
DataAnnotations dinamico RRS feed

  • Pergunta

  • Olá,

    gostaria de saber se posso passar valores para o DataAnnotations dinamicamente.

    Exemplo:

        public class UsuarioConectar
        {
            [Required(ErrorMessage = "Obrigatório")]
            [Display(Name = "Login no sistema")]                
            public string Login { get; set; }
    
            [Required(ErrorMessage = "Obrigatório")]
            [DataType(DataType.Password)]                
            [Display(Name="Senha")]
            public string Senha { get; set; }
        }

    Queria fazer assim:

        public class UsuarioConectar
        {
            [Required(ErrorMessage = "Obrigatório")]
            [Display(Name = "Login no sistema")]                
            public string Login { get; set; }
    
            [Required(ErrorMessage = "Obrigatório")]
            [DataType(DataType.Password)]                
            [Display(Name=ERP.Helpers.Functions.DisplayName())]
            public string Senha { get; set; }
        }

    Queria que o DisplayName, pegue o nome da classe e o nome da propriedade, a partir disto eu iria passar o o displayname.

    Tem como fazer isto?
    Tentei fazer e deu o erro:

    Error	1	An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type	J:\C#\ERP\ERP\Models\Usuario.cs	23	23	ERP

    Abs


    Marlon Tiedt
    www.sesmt.com.br

    quarta-feira, 26 de setembro de 2012 17:03

Respostas

  • Entendi, para multi language esse atributo DisplayName tá preparado mais para trabalhar facilmente e integrado com arquivos de Resources, que não é seu caso (se passar a ser veja aqui).

    Como Fernando já falou o annotation é limitado mesmo, pois só aceita constantes. Mas o que posso imaginar de possibilidade dentro dessas limitações seria criar um atributo personalizado e passar o nome da classe e propriedade ou identificador qualquer mesmo para você fazer o que quer. Ou ainda tenta pesquisar se tem como obter essas informações de classe e propertyname automaticamente no contexto do atributo, pois não parei para pesquisar.

    O atributo ficaria assim na pior das hipóteses:

          public class SeuDisplayNameAttribute : DisplayNameAttribute
          {
              private DisplayAttribute display;
    
              public SeuDisplayNameAttribute(string identificador)
              {
                  this.display = new DisplayAttribute()
                  {
                      Name = SeuMetodoQuePegaDoBancoConformeIdioma(identificador)
                  };
              }
       
              public override string DisplayName
              {
                  get
                  {
                      return display.GetName();
                  }
              }
          }

    E usaria assim ou passando uma constante declarada

            [SeuDisplayName("Endereco")]
            public virtual string Endereco { get; set; }

    Sobre fluent API eu não conheço ainda como setar DisplayName por fluent, só conheço validação por fluent por uma library especifica, que é muito mais legal, mas como seria trabalhar também com metados como o DisplayName por fluent API (independente de framework de persistência)?

    domingo, 30 de setembro de 2012 01:20
  • Olá senhores,

    Porque não utilizar os recursos nativos de globalização?

    http://msdn.microsoft.com/en-us/library/9xdxwwkc(v=vs.80).aspx

    http://msdn.microsoft.com/en-us/library/c6zyy3s9(v=vs.100).aspx

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    domingo, 30 de setembro de 2012 13:40
    Moderador

Todas as Respostas