ASP.NET Core MVC - Usando Partial Views
Neste artigo vamos recordar o conceito de Partial Views e seu uso na ASP .NET Core. |
Uma Partial View é um arquivo de marcação Razor(.cshtml) que renderiza a saída HTML dentro da saída processada de outro arquivo de marcação.
As partial views são usadas para :
Elas não podem ser usadas para manter os elementos de layout comuns. Os elementos de layout comuns precisam ser especificados nos arquivos _Layout.cshtml.
Em um cenário onde temos uma lógica de renderização complexa ou a execução de código for requerida para renderizar a marcação não devemos usar as Partial Views mas sim o recurso View Component.
Alguns fatos importantes sobre as Partial Views:
Como usar uma Partial View
Dentro de um arquivo de marcação, existem várias maneiras de referenciar uma visão parcial, sendo que as recomendadas são:
Neste artigo vamos criar um projeto MVC e mostrar como usar uma partial view.
recursos:
Criando o projeto ASP .NET Core MVC
Abra o Visual Studio 2019 Community e clique em New Project:
No menu File selecione Add -> New Project;
A seguir selecione :
Escolha o template ASP .NET Core Web Application e clique em Next :
A seguir informe o nome AspCore_PartialView1 e clique em Create.
Selecione .NET Core e ASP .NET Core 2.2 e o template Empty e clique em Create:
Abra o arquivo Startup do projeto e inclua o código a seguir:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
namespace AspCore_PartialView1
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
|
Adicionamos o serviço MVC e definimos o roteamento padrão para o controlador HomeController na Action Index.
Agora vamos criar as pastas Controllers e ViewModels no projeto.
Na pasta ViewModels vamos definir os arquivos AlunoViewModel e EnderecoViewModel :
1-AlunoViewModel
public class AlunoViewModel { public int Id { get; set; } public string Nome { get; set; } public string Email { get; set; } public EnderecoViewModel Endereco { get; set; } } |
2-EnderecoViewModel
public class EnderecoViewModel
{
public string Estado { get; set; }
public string Municipio { get; set; }
public string Local { get; set; }
}
|
Iremos usar essas view models para exibir informações na View.
Na pasta Controllers inclua o controlador HomeController:
using AspCore_PartialView1.ViewModels;
using Microsoft.AspNetCore.Mvc;
namespace AspCore_PartialView1.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
var model = new AlunoViewModel
{
Id = 1,
Nome = "Paulo Benitez",
Email = "paulo@email.com",
Endereco = new EnderecoViewModel
{
Estado = "SP",
Municipio = "Lins",
Local = "Rua Projetada 100"
}
};
return View(model);
}
}
}
|
Clique com o botão direito do mouse sobre o método Action Index e a seguir clique em Add View. A seguir informe os dados na janela Add MVC View conforme mostrado a seguir:
Inclua o código abaixo no arquivo Index.cshtml que foi criado na pasta /Views/Home :
@using
AspCore_PartialView1.ViewModels @model AlunoViewModel
<div
style="border: 1px solid black; margin: 5px">
<p>Nome: @Model.Nome</p>
@await
Html.PartialAsync("_Endereco.cshtml", Model.Endereco) |
Observe que estamos usando o HTML Helper assíncrono e informando o nome da partial view como _Endereco.cshtml e o modelo como Endereco.
No código acima PartialAsync retorna um tipo IHtmlContent encapsulado em um Task<TResult>. O método é referenciado prefixando a chamada usando o modificador await com um caractere @.
Vamos criar a partial view _Endereco.html na pasta /Views/Home da mesma forma que fizemos para a view Index. A diferença é que na janela Add MVC View vamos informar o nome _Endereco e selecionar : Create as partial view
A seguir inclua o código abaixo no arquivo _Endereco.cshtml :
@using AspCore_PartialView1.ViewModels
@model EnderecoViewModel
<div style="border: 1px dashed red; margin: 5px">
<strong>Endereço (partial view)</strong>
<hr />
<p>Local: @Model.Local</p>
<p>Municipio: @Model.Municipio</p>
<p>Estado: @Model.Estado</p>
</div>
|
Ao final executando o projeto iremos obter o seguinte resultado:
Podemos obter o mesmo resultado invocando a partial View no arquivo Index.cshtml da seguinte forma:
Usando a Tag Helper Partial
Para poder usar as Tag Helpers no projeto vamos criar o arquivo _ViewImports.cshtml na pasta Views e a seguir incluir a diretiva @addTagHelper
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
Após isso podemos definir o código abaixo no arquivo Index.cshtml para invocar a partial view _Endereco.html
@using AspCore_PartialView1.ViewModels
@model AlunoViewModel
<div style="border: 1px solid black; margin: 5px">
<strong>Detalhes dos Alunos (view Pai)</strong>
<p>Nome: @Model.Nome</p>
<p>Email: @Model.Email</p>
<partial name="~/Views/Home/_Endereco.cshtml" for="Endereco" />
</div>
|
Usamos a Tag Helper partial onde definimos:
- O atributo name que indica o nome ou o caminho da partial view a ser renderizada
- O atributo for que atribui um ModelExpression a ser avaliado em relação ao modelo atual. Um ModelExpression infere a sintaxe @Model. Assim, for="Endereco" pode ser usado em vez de : for="@ Model.Endereco".
Podemos usar também o atributo model que atribui uma instância do model para a partial view. Exemplo:
<partial name="_Produto" model='new Produto { Id = 1, Nome = "Produto 1", Descricao = "Teste" }'>
|
Nota: Este atributo não pode ser usado com o atributo for.
Além disso também temos o atributo view-data que atribui um ViewDataDictionary para a partial view.
No exemplo a seguir temos que a coleção ViewData fica acessível para a partial view:
@{ ViewData["IsNumberReadOnly"] = true; } <partial name="_ProdutoViewPartial" for="Produto" view-data="ViewData">
|
Neste código o valor da chave IsNumberReadOnly é definido como true e adicionado à coleção ViewData e a seguir o ViewData esta sendo disponibilizado para a partial View que vai poder tratar o valor recebido como mostra o exemplo a seguir para o arquivo _ProdutoViewPartial :
@model Teste.Models.Produto
<div class="form-group">
<label asp-for="Number"></label>
@if ((bool)ViewData["IsNumberReadOnly"])
{
<input asp-for="Numero" type="number" class="form-control" readonly />
}
else
{
<input asp-for="Numero" type="number" class="form-control" />
}
</div>
...
|
Pegue o código do projeto aqui : AspCore_PartialView1.zip
"E esta é a
mensagem que dele(Jesus) ouvimos, e vos anunciamos: que Deus é luz, e não há
nele trevas nenhumas."
1
João 1:5
Referências:
ASP .NET Core 2 - MiniCurso Básico - Macoratti
ASP .NET Core MVC - CRUD básico com ADO .NET
ASP .NET Core - Implementando a segurança
ASP .NET Core - Iniciando com ASP .NET Core MVC
ASP .NET Core MVC - Criando um site com MySql e EF
ASP .NET Core - Gerenciador de Despesas Pessoais
Minicurso ASP .NET Core 2.0 - Apresentando MVC
ASP .NET Core - Configurando o ambiente
ASP .NET Core e EF Core - Configurando o ambiente
ASP .NET Core - Como configurar o AutoMapper