Notifications not updating correctly after viewing files in ASP.NET Core Razor Pages

I’m working on an ASP.NET Core Razor Pages project where users can view and manage requests. Each request has a notification badge that should disappear when the user views the files associated with the request. Additionally, this notification should not reappear when the user revisits the page if they’ve already viewed the files.

However, I’m encountering an issue where the notification badge does not update correctly. Even after viewing the files and updating the database, the notification reappears when the user revisits the page.

Here is the relevant code:

Table Structure:

CREATE TABLE [dbo].[VisualizacaoArquivo](
    [IdVisualizacaoArquivo] [int] IDENTITY(1,1) NOT NULL,
    [IdRequisicao] [int] NOT NULL,
    [IdUsuario] [int] NOT NULL,
    [DataVisualizacao] [datetime] NOT NULL,
    CONSTRAINT [PK_VisualizacaoArquivo] PRIMARY KEY CLUSTERED ([IdVisualizacaoArquivo] ASC)
);

Requisicao.cshtml.cs:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;

namespace ProcurementSystem.Pages.Request
{
    [Authorize]
    public class RequisicaoModel : PageModel
    {
        public List<RequisicaoInfo> ListRequests = new List<RequisicaoInfo>();

        public void OnGet()
        {
            string userId = User.Claims.FirstOrDefault(c => c.Type == "IdUsuario")?.Value;

            try
            {
                string connectionString = "Data Source=...; Initial Catalog=...; User id=...; Password=...!";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = @"
                    SELECT 
                        a.IdRequisicao, 
                        a.NomeRequisicao, 
                        b.TipoRequisicao,  
                        a.DataRequisacao, 
                        ISNULL(a.DataConclusao, '') AS DataConclusao, 
                        ISNULL(a.IdUsuarioAtendente, 0) AS IdUsuarioAtendente, 
                        ISNULL(c.Nome, '') AS NomeAtendente, 
                        a.IdUsuarioRequisitante, 
                        d.Nome AS NomeRequisitante, 
                        e.DescricaoStatus,
                        f.Operacao,
                        g.Comentario AS UltimoComentario,
                        h.DescricaoStatusComentario AS StatusComentario,
                        i.DataVisualizacao AS UltimaVisualizacaoArquivos
                    FROM 
                        [dbo].[Requisicao] a
                    LEFT JOIN 
                        [dbo].[TipoRequisicao] b ON a.IdTipoRequisicao = b.IdTipoRequisicao  
                    LEFT JOIN 
                        [dbo].[Usuario] c ON a.IdUsuarioAtendente = c.IdUsuario
                    LEFT JOIN 
                        [dbo].[Usuario] d ON a.IdUsuarioRequisitante = d.IdUsuario
                    LEFT JOIN 
                        [dbo].[StatusRequisicao] e ON a.IdStatusRequisicao = e.IdStatus
                    LEFT JOIN 
                        [dbo].[Operacao] f ON a.IdOperacao = f.IdOperacao
                    LEFT JOIN 
                        [dbo].[HistoricoRequisicao] g ON a.IdRequisicao = g.IdRequisicao AND g.IdRequisicaoHist = (
                            SELECT TOP 1 IdRequisicaoHist 
                            FROM [dbo].[HistoricoRequisicao] 
                            WHERE IdRequisicao = a.IdRequisicao 
                            ORDER BY DataForecast DESC
                        )
                    LEFT JOIN 
                        [dbo].[StatusRequisicaoComentario] h ON g.IdStatusComentario = h.IdStatusComentario
                    LEFT JOIN
                        [dbo].[VisualizacaoArquivo] i ON a.IdRequisicao = i.IdRequisicao AND i.IdUsuario = @UserId
                    WHERE 
                        a.FlagAtiva = 1 and FlagAssumiu = 1";

                    using (SqlCommand command = new SqlCommand(sql, connection))
                    {
                        command.Parameters.AddWithValue("@UserId", userId);

                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                RequisicaoInfo requInfo = new RequisicaoInfo
                                {
                                    IdRequisicao = reader.GetInt32(0).ToString(),
                                    NomeRequisicao = reader.GetString(1),
                                    TipoRequisicao = reader.GetString(2),
                                    DataRequisacao = reader.GetDateTime(3).ToString("yyyy-MM-dd"),
                                    DataConclusao = reader.IsDBNull(4) ? string.Empty : reader.GetDateTime(4).ToString("yyyy-MM-dd"),
                                    IdUsuarioAtendente = reader.IsDBNull(5) ? string.Empty : reader.GetInt32(5).ToString(),
                                    NomeAtendente = reader.GetString(6),
                                    IdUsuarioRequisitante = reader.GetInt32(7).ToString(),
                                    NomeRequisitante = reader.GetString(8),
                                    DescricaoStatus = reader.GetString(9),
                                    Operacao = reader.GetString(10),
                                    UltimoComentario = reader.GetString(11),
                                    StatusComentario = reader.GetString(12),
                                    UltimaVisualizacaoArquivos = reader.IsDBNull(13) ? string.Empty : reader.GetDateTime(13).ToString("yyyy-MM-dd HH:mm:ss")
                                };
                                ListRequests.Add(requInfo);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Handle exception
            }
        }

        [HttpPost]
        public async Task<IActionResult> OnPostVisualizarArquivosAsync([FromForm] int idRequisicao)
        {
            if (idRequisicao == 0)
            {
                return BadRequest(new { message = "IdRequisicao is missing or invalid." });
            }

            string userId = User.Claims.FirstOrDefault(c => c.Type == "IdUsuario")?.Value;
            if (string.IsNullOrEmpty(userId))
            {
                return BadRequest(new { message = "User ID is missing." });
            }

            string connectionString = "Data Source=...; Initial Catalog=...; User id=...; Password=...!";
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    await connection.OpenAsync();
                    string sql = @"
                IF EXISTS (SELECT 1 FROM [dbo].[VisualizacaoArquivo] WHERE IdRequisicao = @IdRequisicao AND IdUsuario = @UserId)
                BEGIN
                    UPDATE [dbo].[VisualizacaoArquivo]
                    SET DataVisualizacao = @DataVisualizacao
                    WHERE IdRequisicao = @IdRequisicao AND IdUsuario = @UserId
                END
                ELSE
                BEGIN
                    INSERT INTO [dbo].[VisualizacaoArquivo] (IdRequisicao, IdUsuario, DataVisualizacao)
                    VALUES (@IdRequisicao, @UserId, @DataVisualizacao)
                END";

                    using (SqlCommand command = new SqlCommand(sql, connection))
                    {
                        command.Parameters.AddWithValue("@DataVisualizacao", DateTime.Now);
                        command.Parameters.AddWithValue("@IdRequisicao", idRequisicao);
                        command.Parameters.AddWithValue("@UserId", userId);

                        await command.ExecuteNonQueryAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"An error occurred: {ex.Message}" });
            }

            return new JsonResult(new { success = true });
        }
    }
}

Requisicao.cshtml:

<div class="modal fade" id="andamentosModal" tabindex="-1" aria-labelledby="andamentosModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="andamentosModalLabel">Andamentos da Requisição</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <ul class="nav nav-tabs" id="andamentoTab" role="tablist">
                    <li class="nav-item" role="presentation">
                        <a class="nav-link active" id="comentarios-tab" data-bs-toggle="tab" href="#comentarios" role="tab" aria-controls="comentarios" aria-selected="true">Comentários</a>
                    </li>
                    <li class="nav-item" role="presentation">
                        <a class="nav-link" id="arquivos-tab" data-bs-toggle="tab" href="#arquivos" role="tab" aria-controls="arquivos" aria-selected="false">
                            Arquivos <span id="arquivoBadge" class="badge bg-danger" style="display: none;">Novo arquivo</span>
                        </a>
                    </li>
                </ul>
                <div class="tab-content" id="andamentoTabContent">
                    <div class="tab-pane fade show active" id="comentarios" role="tabpanel" aria-labelledby="comentarios-tab">
                        <div class="scrollable-content" style="height: 300px; overflow-y: auto;">
                            <div id="message-container">
                                <!-- Mensagens dinâmicas serão carregadas aqui -->
                            </div>
                        </div>
                    </div>
                    <div class="tab-pane fade" id="arquivos" role="tabpanel" aria-labelledby="arquivos-tab">
                        <div class="scrollable-content" style="height: 300px; overflow-y: auto;">
                            <div id="file-container">
                                <!-- Lista de arquivos será carregada aqui -->
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <div class="fixed-content w-100">
                    <div class="mb-3">
                        <label for="formFile" class="form-label">Carregar arquivo (opcional)</label>
                        <input class="form-control" type="file" id="formFile">
                    </div>
                    <div class="form-floating mb-3">
                        <textarea class="form-control" placeholder="Deixe um comentário aqui" id="floatingTextarea2" style="height: 100px"></textarea>
                        <label for="floatingTextarea2">Adicionar um comentário</label>
                    </div>
                    <div class="mb-3">
                        <label for="listaStatus">Selecione o status:</label>
                        <select id="statusSelect" class="form-control"></select>
                    </div>
                    <button type="button" id="btnInserirComentario" class="btn btn-primary">Inserir Comentário</button>
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $('#arquivos-tab').on('shown.bs.tab', function () {
        $('#arquivoBadge').hide();

        var selectedData = $('#tabelaRequisicoes').DataTable().row('.selected').data();

        if (selectedData && selectedData.IdRequisicao) {
            var idRequisicao = selectedData.IdRequisicao;

            var postData = {
                idRequisicao: idRequisicao
            };

            console.log("Dados a serem enviados:", postData); // Adicionando log
            var token = $('input[name="__RequestVerificationToken"]').val();

            $.ajax({
                type: 'POST',
                url: '/Request/Requisicao?handler=VisualizarArquivos',
                data: postData,
                headers: {
                    "RequestVerificationToken": token
                },
                success: function (data) {
                    console.log("Arquivos marcados como visualizados:", data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    console.error("Erro ao marcar arquivos como visualizados:", textStatus, errorThrown);
                    console.error("Response:", jqXHR.responseText); // Adicionando log para a resposta do erro
                }
            });
        } else {
            console.warn("Nenhuma linha selecionada ao tentar marcar arquivos como visualizados.");
        }
    });
</script>

I’ve tried to update the database when a user views the files and to fetch this information correctly when the page is reloaded. However, the notification badge does not seem to update correctly.

Can anyone help me identify what might be going wrong or suggest any improvements?

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật