在我的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>
有人遇到过这种情况吗?遇到这种情况我们该如何解决。
我解决了问题,我正在分享解决方案,以防有人遇到同样的问题。
我使用任务类型进行列表操作。当我使用 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结构。