Usuário com melhor resposta
DataAnnotations dinamico

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
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)?
- Editado rs.developer domingo, 30 de setembro de 2012 02:22
- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 11:49
- Marcado como Resposta Marlon Tiedt terça-feira, 2 de outubro de 2012 11:38
-
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- Sugerido como Resposta rs.developer domingo, 30 de setembro de 2012 14:50
- Não Sugerido como Resposta rs.developer domingo, 30 de setembro de 2012 14:50
- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 11:49
- Marcado como Resposta Marlon Tiedt terça-feira, 2 de outubro de 2012 11:38
Todas as Respostas
-
Oi Marlon,
Infelizmente não é possível.
Para estes casos utilize a Fluent API.
[]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- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 11:49
-
-
Marlon, não entendi na prática o que você precisa pro usuário, e o que retorna esse ERP.Helpers.Functions.DisplayName()?
- Editado rs.developer sábado, 29 de setembro de 2012 15:45
-
Olá,
a minha ideia é a seguinte, em vez de deixar fixo o comando abaixo:
[Display(Name="Senha")]
queria fazer um método, que pegue o nome da classe, e o atribuito, e vá na base de dados ou num xml, e pegue o nome do Display para ficar dinamico e fazer internacionalização do sistema....
Ficou mais claro?
absMarlon Tiedt
www.sesmt.com.br -
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)?
- Editado rs.developer domingo, 30 de setembro de 2012 02:22
- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 11:49
- Marcado como Resposta Marlon Tiedt terça-feira, 2 de outubro de 2012 11:38
-
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- Sugerido como Resposta rs.developer domingo, 30 de setembro de 2012 14:50
- Não Sugerido como Resposta rs.developer domingo, 30 de setembro de 2012 14:50
- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 11:49
- Marcado como Resposta Marlon Tiedt terça-feira, 2 de outubro de 2012 11:38
-
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
Pois é, é o mais "comum" e facilitado pelo framework, indiquei isso também caso ele mude de ideia em relação ao tipo de armazenamento, mas se ele tiver motivo pra ser em banco de dados tem lá suas vantagens também em relação ao que o framework já oferece.
- Editado rs.developer domingo, 30 de setembro de 2012 15:00