Nesse artigo irei mostrar como criar data annotations para usar nas model do MVC e combinar o HtmlHelpers para renderizar as tags e atributos do KnockoutJS.
Atualizações:
Fev – 2017
– ValueDataBind – Opção para configurar quando o textbox atualizará a model.
Dez – 2016
– DoubleDataBind – Para uso de campos Double e Moeda.
– NoDataValTag – Adiciona um atributo data-val=”false”.
KnockoutJS é um plugin javascript para trabalhar com design pattern Model-View-View-Model (MVVM). Quando a model muda, toda a interface muda automaticamente. Assim como AngularJS ele possibilita o controle total do estado e mudanças na view e na model.
No MVC existem diversos Data Annotations para usar nas models. O objetivo aqui é criar alguns customizados para trabalhar com o KnockoutJS.
Vamos começar!
O que precisamos?
1 – aplicação MVC.
2 – Annotations para criar o atributo DataBind para o KnockoutJS.
2.1 – EnableDataBind: habilita ou desabilita um campo.
2.2 – MaskDataBind: máscara para os campos.
2.3 – DateDataBind: transforma um input em um campo com máscara de data.
2.4 – OptionsDataBind: configura as opções de um dropdownlist.
3 – HtmlHelper para renderizar os campos com esses data annotations.
3.1 – InputFor: Renderiza um input para KnockoutJS.
3.2 – SelectFor: Renderiza um select para KnockoutJS.
A tela:
Todos os campos são controlados pelo KnockoutJS.
Eu configurei alguns annotations para a model Person.
Models/Person.cs
public sealed class Person { [Display(Name = "Name")] [Required] [ValueDataBind("person.Name")] [CssClassTag("form-control")] public string Name { get; set; } [ValueDataBind("person.Id")] public string Id { get; set; } [Display(Name = "Email")] [Required] [EmailAddress] [EnableDataBind("isEnableToEdit")] [ValueDataBind("person.Email")] [CssClassTag("form-control")] public string Email { get; set; } [Display(Name = "Bith Date")] [DateDataBind("person.BithDate")] [CssClassTag("form-control")] public DateTime? BithDate { get; set; } [Display(Name = "Gender")] [EnableDataBind("isEnableToEdit")] [OptionsDataBind("genders", "person.Gender")] [CssClassTag("form-control")] public int? Gender { get; set; } }
No HTML o uso do HtmlHelper é mais ou menos assim:
Views/Person/Index.cshtml
@Html.InputFor(x => x.Person.Name) @Html.InputFor(x => x.Person.BithDate) @Html.SelectFor(x => x.Person.Gender) @Html.InputFor(x => x.Person.Email)
Assim o código acima será renderizado como:
<input class="text-box single-line, form-control" data-val="true" data-val-required="The field Name is required." id="Person_Name" name="Person.Name" type="text" value="" data-bind="value: person.Name"> <input class="text-box single-line, form-control" data-val="true" data-val-date="The field Bith Date must be a date." id="Person_BithDate" name="Person.BithDate" type="text" value="" data-bind="value: person.BithDate, dateValue: person.BithDate, mask: { mascara: '99/99/9999', tipo: 'Date', value: person.BithDate }"> <select id="Person_Gender" name="Person.Gender" data-bind="enable: isEnableToEdit, options: genders, optionsText: 'Name', optionsValue:'Id', value: person.Gender" class="form-control"></select> <input class="text-box single-line, form-control" data-val="true" data-val-email="O campo Email não é um endereço de email válido." data-val-required="The field Email is required" id="Person_Email" name="Person.Email" type="email" value="" data-bind="enable: isEnableToEdit, value: person.Email">
O código javascript abaixo é para configurar os dados que serão controlados pelo KnockoutJS na tela. A propriedade “isEnableToEdit” é uma função que é usado no data annotation EnableDataBind na model Person. Ela é uma regra que verificar se o nome da pessoa é maior que 2 e então retorna true/false.
Scripts/view-models/person.js
var personViewModel = function () { var _vm = null, createComputed = function () { _vm.isEnableToEdit = ko.computed(function () { return (_vm.person.Name() || '').length > 2; }, _vm); }, init = function (model) { _vm = { person: ko.mapping.fromJS(model.Person), genders: [ { Id: 0, Name: 'Select...' }, { Id: 1, Name: 'Masc' }, { Id: 2, Name: 'Fem' } ] }; createComputed(); var ctx = $('#person').get(0); ko.applyBindings(_vm, ctx); } return { init: init } }();
Bom é isso. Esperto que tenha ajudado.
Abaixo encontrará alguns links úteis.
Data Annotations e HtmlHelpers de MVC para KnockoutJS
Annotations para KnockoutJS: Perguntas, sugestões ou críticas são bem vindas. Boa sorte!
Faça download completo do código fonte no github. | |
Veja um demo online dessa aplicação no codefinal. |