Olá a todos! estou de volta, peço desculpas pelo enorme hiato. Como quase sempre programação é, na maior parte do tempo, solucionar problemas, então vamos a mais um.:

O Separador decimal

O separador dos valores decimais não seguem o mesmo padrão para o mundo todo (veja no artigo da Wiki: http://pt.wikipedia.org/wiki/Separador_decimal), ou seja em algumas partes do mundo se utiliza (".") ponto e em outros lugares (",") vírgula.

Beco sem saída

O Jquery Validate considera apenas o (".") ponto para decimais, não validando valores com (",") vírgula.


Até aí tudo bem... mas o grande problema vem agora, o ASP.NET na versão para o pt-br, faz o bind do valor decimal considerando o formato utilizado no Brasil que é a (",") vírgula concatenado os valores após o ponto, ou seja o valor 33.2 vira 332.


E aí dá pra resolver?

Claro que sim! se o ASP.NET MVC não está entendendo corretamente os valores decimais então vamos "ensiná-lo". Para isso vamos criar um Binder customizado para tratar os valores decimais enviados do formulário para o controller. Para criar um binder é muito simples crie uma classe que implementa a interface IModelBinder com isso será implementado o método BindModel, é nesse método que será feita a lógica para a correta conversão do valor.

Em 1ª lugar você deve obter o valor que foi submetido, conforme exemplo abaixo:


Feito isso vamos tratar o valor:


Então o que eu fiz no código acima? simples na 1ª condição é verificado, utilizando um regex, se o valor veio com (".") ponto, caso sim ele converte para decimal utilizado CultureInfo.InvariantCulture que considera valores com ponto.

Na 2ª condição é verificado se o valor veio com (",") vírgula aí utiliza CultureInfo.CurrentCulture que no nosso caso converte os valores considerando a (",") vírgula.

A 3ª condição é para os casos que sejam entrados valores inteiros.

Por fim precisamos "registrar" o nosso Binder, no arquivo Global.asax, especificando que o mesmo irá tratar valores decimais:



E agora é só correr pro abraço!

Quer o código? ele tá disponível aqui: https://github.com/rafaelguinho/decimalbinder
Bom, continuando com o tutorial, no Helper crie um método conforme o exemplo:


Esse método cria um link e adiciona ao mesmo um evento de click que faz a chamada para a função Javascript que irá de fato remover os campos. A função Javascript recebe o elemento que será removido e o container que ele faz parte.


Essa é a função que recebe o container e remove o elemento.

Na view responsável pela edição dos telefones faça a chamada do Helper:


O 2º parâmetro é o container que é a classe da div que envolve todos os campos:



Essa foi a 2ª parte do tutorial, me desculpem pela demora na publicação. Na última parte vou mostrar o procedimento para validações. Chau!
As promised in the previous post, this tutorial will show how to create a Helper to handle collections.



For starters if you have not already done so, read the previous post to show how to eliminate the indexes in collections in ASP.NET MVC. I will use as an example the Person (Person) and classes Phones (Phone) where one can have 1 or more phones, a separate edition of the phones that you can view using ASP.NET MVC Editor Templates must be created.





To play you must create a folder called EditorTemplates within the view you add a folder with the same name of the Model, which in this example is Phone. Create a view as below:


The divs involving field is not mandatory.

In view of creation, the Person model, you must cite the editor of phones, as example below:


Now let's create the Helper. Create a static with the name HtmlHelpers class. Within this class create a method as below:



This will be responsible for adding one more field method. This method is an extension of the HtmlHelper class, and receives as parameters the name that should appear on the link, the container where the new field is included, the collection name and type of the collection.

1st line an instance of the collection using the same type is created.



In the 2nd line it creates a view that will be added. This line makes a call to the JsEnconde method, used to make adjustments to the generated html, the code of this method is somewhat extensive and how the code will be available will not show it here.




In the 3rd line is made ​​a replace to add the correct name of the property field. 


In 4th line call Javascript function that will be responsible for actually adding the new field is created.


As we saw above field will be added via Javascript, create a script for it and add the following function:



Returning to the helper, add the following lines:



In the above lines to create the link element is taken, receiving as parameters the name of the link and the call to the JavaScript function.

In reference to the view helper and model.


Shortly after the call to make the helper. Note that the parameter refers to the container is nothing but the id where the new fields will be added.

In part 2 I will demonstrate the procedure for removing and validation of new fields.

The full project is here: https://github.com/rafaelguinho/AddRemove
Conforme prometido no post anterior, neste tutorial vou mostrar como criar um Helper para manipular coleções. 



Para começar caso você ainda não tenha feito, leia o post anterior que mostrar como eliminar os índices em coleções no ASP.NET MVC. Vou utilizar como exemplo as classes Pessoa (Person) e Telefones(Phone) onde pessoa pode ter 1 ou mais telefones, deve ser criada uma view separada para edição dos telefones isso é possível utilizando o Editor Templates do ASP.NET MVC.




Para utilizar você deve criar uma pasta chamada EditorTemplates, dentro da pasta você adiciona uma view com o mesmo nome do Model, que neste exemplo é Phone. Crie a view conforme o exemplo abaixo:


A divs que envolvem os campo não são obrigatórias.

Na view de criação, do modelo Person, você deve referenciar o editor dos telefones, conforme exemplo abaixo: 


Vamos agora a criação do Helper. Crie uma classe static com o nome de  HtmlHelpers. Dentro dessa classe crie um método conforme o exemplo abaixo:



Esse será o método responsável por adicionar mais um campo. Esse método é uma extenção da classe HtmlHelper, e recebe como parâmetros o nome que deve aparecer no link, o contêiner onde o novo campo será incluído, o nome da coleção e o tipo da coleção.

Na 1ª linha é criada uma instancia da coleção utilizando o tipo da mesma.



Na 2ª linha cria-se a view que será adicionada. Essa linha faz uma chamada para o método JsEnconde, que serve para fazer ajustes no html gerado, o código desse método é um pouco extenso e como o código será disponibilizando não vou mostrar ele aqui.



Na 3ª linha é feito um replace para adicionar o nome correto da propriedade ao campo.  


Na 4ª linha é criado a chamada da função Javascript que será a responsável por de fato adicionar o novo campo.


Conforme vimos acima o campo será adicionado via Javascript, para isso crie um script e adicione a seguinte função:



Voltando ao helper, adicione as linhas a seguir:


Nas linhas acima é feita a criação do elemento link, recebendo como parâmetros o nome do link e a chamada para a função Javascript. 

Na view faça referência ao helper e ao model.


Logo após faça a chamada do helper. Observe que o parâmetro referente ao contêiner nada mais é que o id de onde será adicionado os novos campos.

Na 2ª parte vou demostrar o procedimento para remover e as validações dos novos campos.

O projeto completo está aqui: https://github.com/rafaelguinho/AddRemove



As an initial blog post will bring a relatively advanced topic, the question of Bind collections in ASP.NET MVC. There are two way to retrieve nested collections in the view controller, the first a sequential index is used:

Fields in the view:



Recovery in the controller:



The second form allows you to use a non-sequential alphanumeric index:



In this second example is necessary to include a field of type "hidden" for each input field value with the value being the index. Although this second option being more versatile is limited because the index could still be single.

After much study and research I saw that it was possible to create a custom bind, then why not create one to eliminate the indexes and retrieve the collections?
In the bind is possible to have access to the form that was submitted, it allowed access to all properties of the form and its values​​:



will not delve into the bind code, it is available for study and design improvements: https://github.com/rafaelguinho/collectionbinder. To use copy the class Binders folder to your project Global.asax.cs and add a line for each collection:



In his view the collections can now have all the same name, which should be "NametheCollection.Attribute" as example:



In the next post I'll show how to "automate" the process of adding and removing using a Helper. Even more!
Como poste inicial do blog vou trazer um assunto relativamente avançado, que a questão do Bind de coleções no ASP.NET MVC. Há duas forma de se recuperar coleções aninhadas da view no controller, a primeira é utilizado um índice sequencial:

Campos na view:



Recuperação no controller:

A segunda forma permite utilizar um índice não-sequencial alfanumérico:


Neste segundo exemplo é necessário incluir um campo do tipo "hidden", para cada campo de entrada de valor, com o value sendo o índice. Apesar dessa segunda opção ser mais versátil é limitada pois o índice ainda precisar ser único.  

Depois de estudar e pesquisar muito vi que era possível criar um bind customizado, então porque não criar um para eliminar os índices e recuperar as coleções?
No bind é possível ter acesso ao form que foi submetido, isso possibilitou ter acesso a todas as propriedades do formulário e seus valores:


Não vou me aprofundar no código do bind, o mesmo está disponível para estudo e melhorias no projeto: https://github.com/rafaelguinho/collectionbinder. Para utilizar copie a classe da pasta Binders para seu projeto e no Global.asax.cs adicione uma linha para cada coleção:

Na sua view as coleções agora podem ter todas o mesmo nome, que deve ser "NomeDaColeção.Atributo" conforme exemplo:

No próximo post eu vou mostrar como "automatizar" o processo de adicionar e remover utilizando um Helper. Até mais!