skip to Main Content

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


  1. Chosen as BEST ANSWER

    After many hours stuck, I realised that was trying to convert a null value in my partialview:

    @Model.HorarioAgendado.Value.ToShortTimeString()
    

    I changed to:

    @(Model.HorarioAgendado != null ? Model.HorarioAgendado.Value.ToShortTimeString() : "")
    

    Works well.


  2. can you modify your code?

      [HttpGet("/pos/PedidoDetalhes")]
            public async Task<IActionResult> PedidoDetalhes(int id, string view)
            {
                PartialViewResult partialView = PartialView(view, await _IAppPedido.GetPedidoPorId(id));
                return partialView;
            }
    

    and

    var options = {};
            options.type = "GET";
            options.url = "/pos/PedidoDetalhes";
            options.cache = true;
            options.async = true;
            options.dataType = "HTML";
            contentType = "text/html; 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(dataw);
                $("#modal-placeholder").fadeIn('fast');
                $('#confModal').modal('show');
            };
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search