ASP.NET MVC 6 — Conhecendo as TagHelpers

NetCoders
netcoders
Published in
3 min readAug 5, 2015

Neste artigo vamos falar sobre as TagHelpers, uma nova forma de declarar os elementos Html no ASP.NET MVC 6.

Quem não se lembra do código misto do ASP 3.0 (HTML + VBSCRIPT), onde tudo era uma coisa só, essa forma de escrita voltou a tona com o ASP.NET MVC 1.0 e com o lançamento da View Engine Razor (MVC 3.0) começamos a ter algo bem mais trabalhado integrando Views e ViewModels de forma mais harmônica através do processo de Model Binding.

Tag Helpers

As TagHelpers simplificam muito a forma de escrever o Html da View, tornando até mesmo mais atraente para os designers que antes torciam o nariz para os Html Helpers soltos nas Views.

Show me the Code

Vamos comparar as diferenças de sintaxe entre os Html Helpers e TagHelpers:

  • Validation Summary

Html Helper

[code language=”csharp”]
@Html.ValidationSummary(true)
[/code]

Tag Helper

[code language=”html”]
<div asp-validation-summary=”All” id=”validation_day” class=”form-group”>
<span style=”color:red”>This is my message</span>
</div>
[/code]

  • ValidationMessageFor

Html Helper

[code language=”csharp”]
@Html.ValidationMessageFor(model => model.Nome)
[/code]

Tag Helper

[code language=”html”]
<span asp-validation-for=”Nome” />
[/code]

  • Select

Html Helper

[code language=”csharp”]
@Html.DropDownListFor(model=>model.Tags)
[/code]

Tag Helper

[code language=”html”]
<select asp-for=”Tags” asp-items=”(IEnumerable<SelectListItem>)Model.Tags” size=”20" class=”form-control”>
<option value=””> — Selecione — </option>
</select>
[/code]

  • Form

Html Helper

[code language=”csharp”]
@using (Html.BeginForm(“Create”))
{
@Html.AntiForgeryToken()
}
[/code]

Tag Helper

[code language=”html”]
<form asp-anti-forgery=”false” asp-action=”Create”>
</form>
[/code]

  • Hidden

Html Helper

[code language=”csharp”]
@Html.HiddenFor(model=>model.Id)
[/code]

Tag Helper

[code language=”html”]
<input type=”hidden” asp-for=”Id” /></pre>
[/code]

  • Label

Html Helper

[code language=”csharp”]

@Html.LabelFor(model => model.Nome, new { @class = “control-label col-md-2” })

[/code]

Tag Helper

[code language=”html”]
<label asp-for=”Nome” class=”control-label col-md-2" />
[/code]

O Código das Tag Helpers

Como o código fonte do ASP.NET MVC é “open source” você pode acompanhar as issues do time e a evolução da mágica do framework, inclusive podemos ver todo o desenvolvimento das taghelpers.

GitHub TagHelpers

O legal disso é que podemos olhar o que elas estão fazendo internamente e entender melhor como usa-las.

Vamos olhar um pouco a TagHelper Select.

TagHelper Select, inside your soul

As TagHelpers não são milagres mágicos do Tinhoso, são classes bem desenhadas para realizar estas opções que teríamos que fazer no braço.

[code language=”csharp”]
namespace Microsoft.AspNet.Mvc.TagHelpers
{
[TargetElement(“select”, Attributes = ForAttributeName)]
public class SelectTagHelper : TagHelper
{
private const string ForAttributeName = “asp-for”;
private const string ItemsAttributeName = “asp-items”;

<strong>…More Code Below</strong>
}
}

[/code]

Veja que as Constants são os atributos que vamos colocar nas Tags Html, caso não tenha notado a diferença, vai até o Item Select acima e veja os nomes.

E abaixo o método Process realiza o trabalho de transformação:

[code language=”csharp”]
public override void Process(TagHelperContext context, TagHelperOutput output)
{
// Note null or empty For.Name is allowed because TemplateInfo.HtmlFieldPrefix may be sufficient.
// IHtmlGenerator will enforce name requirements.
var metadata = For.Metadata;
if (metadata == null)
{
throw new InvalidOperationException(Resources.FormatTagHelpers_NoProvidedMetadata( “<select>”
ForAttributeName,
nameof(IModelMetadataProvider),
For.Name));
}
var realModelType = For.ModelExplorer.ModelType;
var allowMultiple = typeof(string) != realModelType &&

typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(realModelType.GetTypeInfo());

// Ensure GenerateSelect() _never_ looks anything up in ViewData.

var items = Items ?? Enumerable.Empty();
var currentValues = Generator.GetCurrentValues(
ViewContext,
For.ModelExplorer,
expression: For.Name,
allowMultiple: allowMultiple);

var tagBuilder = Generator.GenerateSelect(
ViewContext,
For.ModelExplorer,
optionLabel: null,
expression: For.Name,
selectList: items,
currentValues: currentValues,
allowMultiple: allowMultiple,
htmlAttributes: null);

if (tagBuilder != null)
{
output.MergeAttributes(tagBuilder);
output.PostContent.Append(tagBuilder.InnerHtml);
}
// Whether or not (not being highly unlikely) we generate anything, could update contained
// elements. Provide selected values for tag helpers. They’ll run next.
ViewContext.FormContext.FormData[SelectedValuesFormDataKey] = currentValues;
}

[/code]

Custom Tag Helpers

Sabendo disso com certeza notamos a possibilidade de criar as nossas próprias Tag Helpers Customizadas e isso é ótimo.

Existem componentes particulares por cada cliente e suas aplicações e com esta técnica podemos melhorar a questão do reaproveitamento e padronização das aplicações.

Segue link com um exemplo de TagHelper Customizada Clique Aqui.

--

--