Could some one give a help.
I have a View and a Partial View (to be loaded in a boostrap modal).
When I try to convert my partial view as string, to be returned to my view, it comes empty. But, If I put just some tags inside the partial view (without any operator/for each etc) it return without any problem. What am I doing wrong?
I did it before and worded fine, but don’t know what is going on now. Doesn’t show any error. My modal open empty.
My view: Pedido/Producao.cshtml
@model Kepler.Domain.ViewModels.App.PedidoAtivoViewModelPos
<div class="row">
@foreach (var item in Model.pedidosConfirmar)
{
<div class="col-lg-6 mb-4">
<a href="#" id="confButton" data-toggle="modal" data-target="#confModal" data-id="@item.IdPedido" class="card bg-warning text-white shadow text-decoration-none">
<div class="card-body">
<div>#@item.IdPedido</div>
@if (item.IdPedidoAtendimento == 1)
{<i class="fa fa-biking"></i>}
@if (item.IdPedidoAtendimento == 2)
{<i class="fa fa-store"></i> }
</div>
</a>
</div>
}
</div>
<!-- Modal -->
<div class="modal fade" id="confModal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="ModalLabel"></h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body d-inline text-center">
<div id="modal-placeholder"></div>
<form asp-area="Pos" id="confForm">
@Html.Hidden("id", "", new { @class = "hiddenId" })
<button class="btn btn-info btn-sm" id="btnConfirma" data-confirmar="modal">
Confirmar
</button>
<button class="btn btn-danger btn-sm" id="btnSuspeito" data-suspeito="modal">
Suspeito
</button>
</form>
</div>
</div>
</div>
</div>
@section scripts{
<script src="~/js/pedidoProducaoModalPos.js"></script>
}
My Partial View: Pedido/_ProducaoPedidoPartial.cshtml
@model Kepler.Domain.ViewModels.App.PedidoAtivoViewModelPos
<div class="card bg-light mt-2">
<div class="card-header">
<div class="text-info">
Descrição
</div>
</div>
<div class="card-body m-1 p-1">
<div class="row">
<div class="col-sm-6 small">
<div class="text-info">
<label class="control-label text-body">Loja:</label> @Model.Unidade
</div>
<div class="text-info">
<label class="control-label text-body">Pedido:</label> @Model.DataPedido
</div>
@if (Model.DataEntrega != null)
{
<div class="text-info">
<label class="control-label text-body">Entrega:</label> @Model.DataEntrega
</div>
}
@if (Model.IdPedidoAtendimento == 2)
{
<div class="text-info">
<label class="control-label text-body">Horário agendado:</label> @Model.HorarioAgendado.Value.ToShortTimeString()
</div>
<div class="text-info">
<label class="control-label text-body">Endereço:</label> @Model.Unidade
</div>
}
</div>
<div class="col-sm-6 small">
<div class="text-info">
<label class="control-label text-body">Atendimento:</label> @Model.Atendimento
</div>
@if (Model.IdPedidoAtendimento == 1)
{
<div class="text-info">
<label class="control-label text-body">Taxa de entrega:</label> R$ @Model.TaxaServico
</div>
}
</div>
</div>
</div>
</div>
<div class="card bg-light mt-2">
<div class="card-header">
<div class="text-info">Items do pedido</div>
</div>
<div class="card-body m-1 p-1">
@foreach (var item in Model.PeditoItens)
{
<div class="row mt-1 mb-1">
<div class="col-1 text-secondary text-center small text-nowrap">
<div class="ml-2 mt-1">@item.Quantidade</div>
</div>
<div class="col-7 text-secondary">
<span class="text-dark small">@item.IdProdutoNavigation.Nome</span>
@if (item.IdProdutoNavigation.IdProdutoCategoria == 1)
{
<small class="d-block">
@item.IdProdutoNavigation.IdProdutoTamanhoNavigation.Valor
</small>
<small class="d-block">
@item.IdProdutoNavigation.IdProdutoTipoMassaNavigation.Valor
</small>
}
@if (item.IdProdutoNavigation.IdProdutoCategoria == 2)
{
<small class="d-block">
@item.IdProdutoNavigation.IdProdutoTamanhoNavigation.Valor
</small>
}
@if (item.IdProdutoNavigation.IdProdutoCategoria == 3 || item.IdProdutoNavigation.IdProdutoCategoria == 5)
{
<small class="d-block">
@item.IdProdutoNavigation.Descricao
</small>
}
</div>
<div class="col-3 text-info small text-nowrap">
R$ @(item.Preco * item.Quantidade)
<div class="text-secondary">
@if (item.Quantidade > 1)
{
<small>
@item.Quantidade <small>x</small> R$ @item.Preco
</small>
}
</div>
</div>
</div>
<hr class="m-0" />
}
<div class="row mt-1 mb-1">
<div class="col-8"></div>
<div class="col-4 text-info small">
R$ @Model.Total
</div>
</div>
</div>
</div>
My controller: PedidoController.cs
public async Task<IActionResult> Producao()
{
return View(await _IAppPedido.ListarTodosPedidosPorUnidadeProducao());
}
[HttpPost("/pos/PedidoDetalhes")]
public async Task<IActionResult> PedidoDetalhes(int id, string view)
{
// Converte as String
PartialViewResult partialView = PartialView(view, await _IAppPedido.GetPedidoPorId(id));
string viewContent = ConvertViewToString(this.ControllerContext, partialView,
^^^^^^
comes empty!!
_viewEngine);
return Json(new { partialView = viewContent });
}
public string ConvertViewToString(ControllerContext controllerContext, PartialViewResult pvr, ICompositeViewEngine _viewEngine)
{
using StringWriter writer = new StringWriter();
ViewEngineResult vResult = _viewEngine.FindView(controllerContext, pvr.ViewName, false);
ViewContext viewContext = new ViewContext(controllerContext, vResult.View, pvr.ViewData, pvr.TempData, writer, new HtmlHelperOptions());
vResult.View.RenderAsync(viewContext);
return writer.GetStringBuilder().ToString();
}
My js:
$(function () {
$('a[data-toggle="modal"]').click(function (event) {
var idPedido = $(this).attr('data-id');
var options = {};
options.type = "POST";
options.url = "/pos/PedidoDetalhes";
options.cache = true;
options.async = true;
options.dataType = "JSON";
contentType = "application/json; charset=utf-8",
options.data = {
"id": idPedido,
"view": "_ProducaoPedidoPartial"
};
options.beforeSend = function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
};
options.success = function (data) {
$('#modal-placeholder').html(data.partialView);
$("#modal-placeholder").fadeIn('fast');
$('#confModal').modal('show');
};
options.error = function () {
alert("erro");
};
$.ajax(options);
});
});
My repository:
// To load my view
public async Task<PedidoAtivoViewModelPos> ListarTodosPedidosPorUnidadeProducao()
{
using var db = new KeplerContext(_optionsBuilder);
var pedido = await db.Pedido
.Include(p => p.IdPedidoAtendimentoNavigation)
.Include(p => p.IdUnidadeNavigation)
.FirstOrDefaultAsync(m => m.IdUnidade == 1);
var result = new PedidoAtivoViewModelPos();
var atendente = await db.Usuario
.Where(u => u.Id == pedido.IdAtendente)
.FirstOrDefaultAsync();
if (atendente != null)
{
result.Atendente = atendente.Nome;
result.ImgAtendente = atendente.Imagem;
}
var entregador = await db.Usuario
.Where(u => u.Id == pedido.IdEntregador)
.FirstOrDefaultAsync();
if (entregador != null)
{
result.Entregador = entregador.Nome;
}
var resultConfirmar = db.Pedido
.Where(u => u.IdPedidoStatus == 0)
.ToList();
if (resultConfirmar != null)
{
result.pedidosConfirmar = resultConfirmar;
}
var resultAberto = db.Pedido
.Where(u => u.IdPedidoStatus == 1)
.ToList();
if (resultAberto != null)
{
result.pedidosAberto = resultAberto;
}
var resultPrep = db.Pedido
.Where(u => u.IdPedidoStatus == 2)
.ToList();
if (resultPrep != null)
{
result.pedidosPreparacao = resultPrep;
}
var resultFinal = db.Pedido
.Where(u => u.IdPedidoStatus == 3)
.ToList();
if (resultFinal != null)
{
result.pedidosFinalizacao = resultFinal;
}
return result;
}
// To load my partil view (inside a modal)
public async Task<PedidoAtivoViewModelPos> GetPedidoPorId(int id)
{
using var db = new KeplerContext(_optionsBuilder);
var pedido = await db.Pedido
.Include(p => p.IdPedidoAtendimentoNavigation)
.Include(p => p.IdUnidadeNavigation)
.FirstOrDefaultAsync(m => m.IdPedido == id && m.IdUnidade == 1);
var pedidoItens = await db.PedidoItens
.Where(i => i.IdPedido == id)
.Include(p => p.IdProdutoNavigation)
.Include(p => p.IdProdutoNavigation.IdProdutoTamanhoNavigation)
.Include(p => p.IdProdutoNavigation.IdProdutoTipoMassaNavigation)
.ToListAsync();
foreach (PedidoItens i in pedidoItens)
{
if (i.IdProdutoMeia != null)
{
var produto = db.Produto
.First(p => p.IdProduto == i.IdProdutoMeia);
i.IdProdutoNavigation.Nome = i.IdProdutoNavigation.Nome + "/" + produto.Nome.Replace("Pizza", "").Trim();
}
}
var result = new PedidoAtivoViewModelPos()
{
IdPedido = pedido.IdPedido,
DataPedido = pedido.DataPedido,
DataEntrega = pedido.DataEntrega,
DataSaida = pedido.DataSaida,
HorarioAgendado = pedido.HorarioAgendado,
TaxaServico = pedido.TaxaServico,
IdPedidoStatus = pedido.IdPedidoStatus,
IdPedidoAtendimento = pedido.IdPedidoAtendimento,
Atendimento = pedido.IdPedidoAtendimentoNavigation.Nome,
Unidade = pedido.IdUnidadeNavigation.Nome,
Telefone = pedido.IdUnidadeNavigation.Telefone,
Total = pedidoItens.Sum(it => it.Preco * it.Quantidade) + pedido.TaxaServico,
PeditoItens = pedidoItens
};
var atendente = await db.Usuario
.Where(u => u.Id == pedido.IdAtendente)
.FirstOrDefaultAsync();
if (atendente != null)
{
result.Atendente = atendente.Nome;
result.ImgAtendente = atendente.Imagem;
}
var entregador = await db.Usuario
.Where(u => u.Id == pedido.IdEntregador)
.FirstOrDefaultAsync();
if (entregador != null)
{
result.Entregador = entregador.Nome;
}
var resultConfirmar = db.Pedido
.Where(u => u.IdPedidoStatus == 0)
.ToList();
if (resultConfirmar != null)
{
result.pedidosConfirmar = resultConfirmar;
}
var resultAberto = db.Pedido
.Where(u => u.IdPedidoStatus == 1)
.ToList();
if (resultAberto != null)
{
result.pedidosAberto = resultAberto;
}
var resultPrep = db.Pedido
.Where(u => u.IdPedidoStatus == 2)
.ToList();
if (resultPrep != null)
{
result.pedidosPreparacao = resultPrep;
}
var resultFinal = db.Pedido
.Where(u => u.IdPedidoStatus == 3)
.ToList();
if (resultFinal != null)
{
result.pedidosFinalizacao = resultFinal;
}
return result;
}
My View model: PedidoAtivoViewModelPos
public class PedidoAtivoViewModelPos
{
public int IdPedido { get; set; }
public DateTime DataPedido { get; set; }
public DateTime? DataEntrega { get; set; }
public DateTime? DataSaida { get; set; }
public DateTime? HorarioAgendado { get; set; }
public decimal TaxaServico { get; set; }
public byte IdPedidoStatus { get; set; }
public byte IdPedidoAtendimento { get; set; }
public string Atendimento { get; set; }
public string Unidade { get; set; }
public string Telefone { get; set; }
public decimal Total { get; set; }
// Atendente
public string Atendente { get; set; }
public string ImgAtendente { get; set; }
// Entregador
public string Entregador { get; set; }
public virtual List<PedidoItens> PeditoItens{ get; set; }
public virtual List<Pedido> pedidosConfirmar { get; set; }
public virtual List<Pedido> pedidosAberto { get; set; }
public virtual List<Pedido> pedidosPreparacao { get; set; }
public virtual List<Pedido> pedidosFinalizacao { get; set; }
}
2
Answers
After many hours stuck, I realised that was trying to convert a null value in my partialview:
I changed to:
Works well.
can you modify your code?
and