none
Como executar Trim() ao montar um objeto pelo MVC 4 Web API? RRS feed

  • Pergunta

  • Olá pessoal,

    preciso executar o método Trim() nas propriedade de tipo String ao montar meu objeto no controller.

    Ex.:

    public object Post(Cliente cliente)
    {
      cliente.NomeStr = cliente.NomeStr.Trim();

    Minha ideia é evitar o código acima. Imaginem uma classe com 30 campos String. Seriam 30 linhas como essa.

    Uma solução seria chamar o Trim() ao enviar para o servidor. Seria até fácil (faria isso em meu componente no cliente), mas o problema é que tenho métodos que serão usados por serviços que precisam chamar o Trim() antes de gravar.

    O que acham? Tem como resolver de forma mais automática?

    Abraço,

    Danilo


    Danilo Abranches

    quarta-feira, 8 de maio de 2013 15:18

Respostas

  • O ideal seria usar Reflection para adquirir todas as propriedades da sua classe, ver se é string, se for string seta-las com trim(). Exemplo:

    Type type = cliente.GetType();
    PropertyInfo[] properties = type.GetProperties();
    
    foreach (PropertyInfo property in properties)
    {
        if (property.GetType() == typeof(string)) {
            property.SetValue(cliente, string.Trim(property.GetValue(cliente, null)));
        }
    }

    Eu fiz de cabeça, não testei, pois estou sem Visual Studio no momento. Mas vai ser mais ou menos isso aí. Se não der certo e você não conseguir, mais tarde, quando eu chegar em casa eu posto a solução completa para você.


    Ao infinito e além!


    quarta-feira, 8 de maio de 2013 17:13

Todas as Respostas

  • O ideal seria usar Reflection para adquirir todas as propriedades da sua classe, ver se é string, se for string seta-las com trim(). Exemplo:

    Type type = cliente.GetType();
    PropertyInfo[] properties = type.GetProperties();
    
    foreach (PropertyInfo property in properties)
    {
        if (property.GetType() == typeof(string)) {
            property.SetValue(cliente, string.Trim(property.GetValue(cliente, null)));
        }
    }

    Eu fiz de cabeça, não testei, pois estou sem Visual Studio no momento. Mas vai ser mais ou menos isso aí. Se não der certo e você não conseguir, mais tarde, quando eu chegar em casa eu posto a solução completa para você.


    Ao infinito e além!


    quarta-feira, 8 de maio de 2013 17:13
  • Fabio,

    dessa forma acho que funciona sim, mas queria ir mais além. Na verdade, quero chamar uma função com esse código que você postou em apenas um ponto do código. Em algum evento disparado antes do objeto chegar na action do controller. Assim evitaria que eu fizesse isso para cada controller de minha aplicação.

    É possível?


    Danilo Abranches

    quarta-feira, 8 de maio de 2013 17:44
  • Existem algumas maneiras de fazer isso... mas vou te falar viu, acho mais fácil você passar um foreach em todas as strings e executar o trim(). Mas enfim, uma forma de você fazer isso é usando um custom model binding...

    Neste exemplo http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx o autor usa um custom model binding para converter decimal para cultura desejada. No seu caso, você irá ter que fazer um para sua classe, com suas regras.


    Ao infinito e além!

    quinta-feira, 9 de maio de 2013 12:59