Blazor -  Colocando o Foco em um controle via JS

Hoje veremos como colocar o foco em um controle de formulário no Blazor usando JavaScript.

Se você esta chegando agora e não sabe o que é o Blazor leia o artigo ASP .NET Core - Iniciando com o Blazor - Macoratti; se você já conhece e quer saber mais pode fazer o curso de Blazor Essencial.  

Colocando o foco em um controle via JavaScript

Para poder colocar o foco em um controle de formulário Blazor vamos criar uma pequena aplicação Blazor para simular o cadastro dos dados de um Cliente.

A seguir vamos criar uma função JavaScript para colocar o foco em um elemento e vamos usar este recurso para colocar o foco nos controles do formulário.

Vejamos isso na prática.

Recursos usados:

Criando o projeto no VS Community 2019

bra o VS 2019 Community (versão mínima 16.4) e selecione a opção Create a New Project;

A seguir selecione a opção Blazor app e clique em next;

Informe o nome do projeto :  Blazor_FocusInput, a localização e clique em Create;

Selecione a Blazor Server App. Não vamos usar autenticação e vamos habilitar o https.

Clique no botão Create para criar o projeto.

Com o projeto criado podemos (é opcional) limpar o projeto excluindo os arquivos abaixo e suas referências:

Na pasta Data do  projeto vamos criar a classe Cliente com os dados abaixo:

    public class Cliente
    {
        public string Nome { get; set; }
        public int Idade { get; set; }
        public string Email { get; set; }
   }

Na pasta wwwroot vamos criar o arquivo JavaScript Utils.js com o seguinte código:

function focusById(elementId) {
    var element = document.getElementById(elementId);
    if (element) {
        element.focus();
    }
}

Este código vai receber o id de um Elemento e vai colocar o foco neste elemento.

Após temos que incluir no arquivo _Host.cshtml a referência ao script criado no arquivo:

...
   <script src="Utils.js"></script>
   <script src="_framework/blazor.server.js"></script>
</body>
</html>

Agora vamos criar o formulário alterando o código do componente Index.razor da pasta Pages:

@page "/"

@inject IJSRuntime js
<h3>Blazor - AutoFocus com JS</h3>
<EditForm Model="cliente">
    <div class="form-group">
        <label>Nome</label>
        <InputText id="txtNome" class="form-control" @bind-Value="@cliente.Nome" />
    </div>
    <div class="form-group">
        <label>Email</label>
        <InputText id="txtEmail" class="form-control" @bind-Value="@cliente.Email" />
    </div>
    <div class="form-group">
        <label>Idade</label>
        <InputNumber class="form-control" @bind-Value="@cliente.Idade" />
    </div>
    <div>
       <button @onclick="Valida">Validar</button>
    </div>
</EditForm>
@code{
    private Cliente cliente = new Cliente();
    private async void Valida()
    {
        if (String.IsNullOrEmpty(cliente.Email))
            await Focus("txtEmail");
    }
    protected async override Task OnAfterRenderAsync(bool firstRender)
    {
        if(firstRender)
        {
            await Focus("txtNome");
        }
    }
    public async Task Focus(string elementId)
    {
        await js.InvokeVoidAsync("focusById", elementId);
    }
}

Neste código fizemos o seguinte:

1- Injetamos o serviço Interop JS : @inject IJSRuntime js

2- Usamos o componente EditForm do Blazor para criar o formulário usando InputText e InputNumber;

3- Criamos o método Focus() invocando a função JavaScript focusById() criada passando o id do elemento;

4- No evento OnAfterRenderAsync(bool firstRender) chamamos o método Focus("txtNome");

5- No evento Valida() verificamos se o valor do Email foi fornecido; se não for invocamos o método Focus("txtEmail");

Agora é só alegria...

Executando o projeto veremos que inicialmente o campo Nome vai receber o foco, e, se clicarmos no botão sem fornecer o valor para Email o foco vai para este campo:

Aguarde mais artigos sobre o Blazor.

Pegue o projeto aqui:   Blazor_FocusInput.zip  (sem as referências)

"Não se turbe o vosso coração; credes em Deus, crede também em mim.
Na casa de meu Pai há muitas moradas; se não fosse assim, eu vo-lo teria dito. Vou preparar-vos lugar."

João 14:1,2

 


Referências:


José Carlos Macoratti