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?