SignalR 和 SqlTableDependency 触发问题:post 后无数据

问题描述 投票:0回答:1

在我的ASP.NET Core项目中,当我使用Ajax添加数据时,我成功列出了数据。 另外,在“详细信息”页面上更新后,我重定向到“索引”页面并查看我在此处更新的数据。 这些代码工作正常且没有错误。 然后我将 SignalR 和 SqlTableDependency 库添加到我的项目中。我无法执行列表操作,因为名为 Sender 的触发器出现在数据库的相关表中。虽然我可以使用 Ajax 列出,但现在我必须刷新页面,或者当我在页面上更新并转到索引时,我必须刷新索引页面才能查看更新的数据。 仍然没有错误,一切正常,但我必须不断刷新页面。

在添加 SignalR 和 SqlTableDependency 之前,我的代码可以正常工作,

AccountingController.cs

[HttpGet]
public async Task<IActionResult> GetExpenseByUser()
{
    var user = await _userManager.FindByNameAsync(User.Identity.Name);
    int id = user.Id;
    var client = _httpClientFactory.CreateClient();
    var responseMessage = await client.GetAsync($"https://localhost:7198/api/Expense/ListExpenseByUser?id={id}");
    if (responseMessage.IsSuccessStatusCode)
    {
        var jsonData = await responseMessage.Content.ReadAsStringAsync();
        var values = JsonConvert.DeserializeObject<List<ResultExpenseByUserDto>>(jsonData);
        return Json(values);
    }
    return View();
}

索引.cshtml,

<script>
    $(document).ready(function () {
        function listExpense() {
            $.ajax({
                type: "Get",
                url: "/Accounting/GetExpenseByUser",
                success: function (value) {
                    $("#tableExpense tbody").empty();
                    var tablerow;
                    $.each(value, (index, item) => {
                        tablerow = $("<tr/>");
                        tablerow.append(`<td><a class="fw-semibold text-primary">#${item.periodID}</a></td>`)
                        tablerow.append(`<td>${item.createUser}</td>`)
                        tablerow.append(`<td>${item.periodMonth}</td>`)
                        tablerow.append(`<td>${item.periodYear}</td>`)
                        switch (item.paymentStatus) {
                            case 9999:
                                tablerow.append(`<td><span class="badge bg-warning-transparent">Bekleniyor</span></td>`)
                                break;
                            case 9998:
                                tablerow.append(`<td><span class="badge bg-warning-transparent">Onay Sürecinde - Yönetici</span></td>`)
                                break;
                            case 1:
                                tablerow.append(`<td><span class="badge bg-warning-transparent">Ödeme Bekleniyor - Muhasebe</span></td>`)
                                break;
                            case 2:
                                tablerow.append(`<td><span class="badge bg-success-transparent">Ödeme Yapıldı</span></td>`)
                                break;
                            case 3:
                                tablerow.append(`<td><span class="badge bg-dark-transparent">Gecikmiş Ödeme</span></td>`)
                                break;
                            case 4:
                                tablerow.append(`<td><span class="badge bg-danger-transparent">İptal Edilen Ödeme</span></td>`)
                                break;
                        }
                        let formattedTotalAmount = parseFloat(item.totalAmount).toLocaleString('tr-TR', { minimumFractionDigits: 2 });
                        tablerow.append(`<td>₺${formattedTotalAmount}</td>`);
                        tablerow.append(`<td><a href="#" class="btn btn-primary-light btn-icon btn-sm"><i class="ri-eye-line"></i></a> <a href="/Accounting/ExpenseTransactions/${item.expenseID}" class="btn btn-primary-light btn-icon btn-sm"><i class="ri-send-plane-2-line"></i></a></td>`);
                        $("#tableExpense").append(tablerow);
                    });
                },
                error: function (xhr, status, error) {
                }
            });
        }

        $("#btnAddExpense").click(function () {
            $.ajax({
                type: "Post",
                url: "/Accounting/Index",
                success: function () {
                    listExpense();

                    Toastify({
                        text: 'Harcama Dönemi Oluşturuldu',
                        duration: 3000,
                        gravity: "top",
                        position: 'right',
                        backgroundColor: "#4CAF50",
                        stopOnFocus: true,
                    }).showToast();
                },
                error: function (xhr, status, error) {
                    var errorMessage = xhr.responseJSON ? xhr.responseJSON : "Bu Döneme Ait Kayıt Bulunmaktadır";
                    Toastify({
                        text: errorMessage,
                        duration: 3000,
                        gravity: "top",
                        position: 'right',
                        backgroundColor: "#f64e60",
                        stopOnFocus: true,
                    }).showToast();
                }
            });
        });
    });
</script>

有人遇到过这种情况吗?遇到这种情况我们该如何解决。

javascript jquery ajax asp.net-core signalr
1个回答
0
投票

我解决了问题,我正在分享解决方案,以防有人遇到同样的问题。

我使用任务类型进行列表操作。当我使用 async/await 编写查询和 API 端代码时,我使用 void 结构进行 post 或 put 操作。在这种情况下,出现了这样的问题,我看到未添加或更新的数据,因为它在没有等待后操作结束的情况下就带来了数据。当我使用 async/await 结构进行 Post、Put 和 Delete 操作时,问题得到了解决。下面您将看到 get 和 post 操作的示例。

我希望它有帮助。祝你工作顺利。

获取,

public async Task<List<ResultExpenseByUserDto>> ListExpenseByUser(int id)
{
    string query = "SELECT TOP(12) E.ExpenseID, U.Name + ' ' + U.Surname AS CreateUser, E.PeriodMonth, E.PeriodYear, E.PaymentStatus, E.TotalAmount, E.Status, E.PeriodID FROM Expense E INNER JOIN AspNetUsers U ON E.CreateUser = U.Id WHERE E.CreateUser = @createUser ORDER BY E.ExpenseID DESC";
    var parameter = new DynamicParameters();
    parameter.Add("@createUser", id);
    using (var connection = _dapperContext.CreateConnection())
    {
        var values = await connection.QueryAsync<ResultExpenseByUserDto>(query, parameter);
        return values.ToList();
    }
}

发帖,

public async Task itemAddExpense(CreateExpenseDto createExpenseDto)
{
    string query = "INSERT INTO Expense (CreateUser, PeriodMonth, PeriodYear, PeriodID) values (@createUser, @periodMonth, @periodYear, @periodID)";
    var parameter = new DynamicParameters();
    parameter.Add("@createUser", createExpenseDto.CreateUser);
    parameter.Add("@periodMonth", createExpenseDto.PeriodMonth);
    parameter.Add("@periodYear", createExpenseDto.PeriodYear);
    parameter.Add("@periodID", createExpenseDto.PeriodID);
    using (var connection = _dapperContext.CreateConnection())
    {
        await connection.ExecuteAsync(query, parameter);
    }
}

API 控制器端,

public async Task<IActionResult> AddExpense(CreateExpenseDto createExpenseDto)
{
    if (await _expenseService.itemIsExpenseDuplicate(createExpenseDto))
    {
        return BadRequest();
    }
    else
    {
        await _expenseService.itemAddExpense(createExpenseDto);
        return Ok("Başarılı");
    }
}

当我遇到错误时 “_expenseService.itemAddExpense(createExpenseDto);” 我没有在该行中使用await结构。

© www.soinside.com 2019 - 2024. All rights reserved.