我有一个代码可以检索以前保存的发票数据,还有一个代码可以在更改价格或数量后再次保存它。问题是,当我按下保存按钮时,没有任何反应,没有消息出现,并且数据没有保存。
using AfterFix.Pages.Clients;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
namespace AfterFix.Pages.Sales
{
public class EditModel : PageModel
{
private readonly string _connectionString = "Data Source=DESKTOP-9CABSPL\\SQLEXPRESS;Initial Catalog=mystore;Integrated Security=True;MultipleActiveResultSets=true";
public SalesInfo salesInfo = new SalesInfo();
public string errorMessage = "";
public string SuccessMessage = "";
public List<InvoiceItem> InvoiceItems { get; set; } = new List<InvoiceItem>();
public async Task<IActionResult> OnGet(int InvNo)
{
try
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
await connection.OpenAsync();
string invoiceQuery = "SELECT id, ClientName, InvDate, InvNo, SubTotal FROM SalesInv WHERE InvNo = @InvNo;";
using (SqlCommand invoiceCommand = new SqlCommand(invoiceQuery, connection))
{
invoiceCommand.Parameters.AddWithValue("@InvNo", InvNo);
using (SqlDataReader invoiceReader = await invoiceCommand.ExecuteReaderAsync())
{
if (invoiceReader.Read())
{
salesInfo.id = "" + invoiceReader.GetInt32(0);
salesInfo.ClientName = invoiceReader.GetString(1);
salesInfo.InvDate = invoiceReader.GetDateTime(2).ToString("yyyy-MM-dd HH:mm:ss");
salesInfo.InvNo = "" + invoiceReader.GetInt32(3);
salesInfo.SubTotal = invoiceReader.GetDecimal(4);
}
}
}
string query = "SELECT ItemName, ItemQuantity, Price, InvNo FROM Titem WHERE InvNo = @InvNo";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@InvNo", InvNo);
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
while (reader.Read())
{
InvoiceItems.Add(new InvoiceItem
{
ItemName = reader["ItemName"].ToString(),
ItemQuantity = Convert.ToInt32(reader["ItemQuantity"]),
Price = Convert.ToDecimal(reader["Price"]),
InvNo = Convert.ToInt32(reader["InvNo"])
});
}
}
}
}
return Page();
}
catch (Exception ex)
{
errorMessage = ex.Message;
return Page();
}
}
public IActionResult OnPost()
{
try
{
using (SqlConnection innerConnection = new SqlConnection(_connectionString))
{
innerConnection.Open();
string itemSql = "INSERT INTO Titem (ItemName, ItemQuantity, Price) VALUES (@ItemName, @ItemQuantity, @Price);";
using (SqlCommand itemCommand = new SqlCommand(itemSql, innerConnection))
{
// Clear parameters once outside the loop
itemCommand.Parameters.Clear();
// Add parameters outside the loop (to be reused in each iteration)
itemCommand.Parameters.Add("@ItemName", SqlDbType.NVarChar);
itemCommand.Parameters.Add("@ItemQuantity", SqlDbType.Int);
itemCommand.Parameters.Add("@Price", SqlDbType.Decimal);
foreach (var item in InvoiceItems)
{
// Validate quantity and price format
if (!IsNumeric(item.ItemQuantity.ToString()) || !IsNumeric(item.Price.ToString()))
{
errorMessage = "Invalid quantity or price format.";
return Page();
}
// Set parameter values in each iteration
itemCommand.Parameters["@ItemName"].Value = item.ItemName;
itemCommand.Parameters["@ItemQuantity"].Value = item.ItemQuantity;
itemCommand.Parameters["@Price"].Value = item.Price;
itemCommand.ExecuteNonQuery();
}
}
}
SuccessMessage = "تم حفظ البيانات بنجاح";
return RedirectToPage("/Sales/Index");
}
catch (Exception ex)
{
errorMessage = $"An error occurred: {ex.Message}";
return Page();
}
}
// Helper method to validate numeric strings
private bool IsNumeric(string value)
{
return decimal.TryParse(value, out _);
}
// Unrelated to error handling
public class InvoiceItem
{
public string ItemName { get; set; }
public int ItemQuantity { get; set; }
public decimal Price { get; set; }
public int InvNo { get; set; }
}
}
}
@page
@model AfterFix.Pages.Sales.EditModel
@{
ViewData["Title"] = "Edit Invoice";
}
<h1>Edit Invoice</h1>
@if (!string.IsNullOrEmpty(Model.errorMessage))
{
<div class="alert alert-danger" role="alert">
@Model.errorMessage
</div>
}
@if (!string.IsNullOrEmpty(Model.SuccessMessage))
{
<div class="alert alert-success" role="alert">
@Model.SuccessMessage
</div>
}
<h2>Invoice Items</h2>
<table class="table">
<thead>
<tr>
<th>Item Name</th>
<th>Quantity</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.InvoiceItems)
{
<tr>
<td>@item.ItemName</td>
<td>@item.ItemQuantity</td>
<td>@item.Price</td>
</tr>
}
</tbody>
</table>
<form method="post">
<button type="submit" class="btn btn-primary">Save</button>
</form>
这四天里,我把所有的东西都改了,代码也仅限于保存数据,只是为了找出问题的原因,但无济于事。连接语句很好,代码也很好。那么问题出在哪里呢?
问题是,当我按下保存按钮时,没有任何反应,没有 出现消息,并且数据未保存。
您需要确保
InvoiceItems
正确绑定在后处理程序上并且 sql 查询正确。
首先,您的表单中没有任何内容,因此它不会向后端发布任何内容。然后模型绑定系统通过
name
属性来绑定属性。所以需要如下的帖子列表模型:
<form method="post">
<table class="table">
<thead>
<tr>
<th>Item Name</th>
<th>Quantity</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@for(int i =0;i<Model.InvoiceItems.Count();i++)
{
<tr>
<td><input asp-for="@Model.InvoiceItems[i].ItemName"/></td>
<td><input asp-for="@Model.InvoiceItems[i].ItemQuantity" /></td>
<td><input asp-for="@Model.InvoiceItems[i].Price" /></td>
</tr>
}
</tbody>
</table>
<button type="submit" class="btn btn-primary">Save</button>
</form>
最后,您需要使用
[BindProperty]
帮助器来确保提交表单时属性正确绑定到表单数据。
private readonly string _connectionString = "Data Source=DESKTOP-9CABSPL\\SQLEXPRESS;Initial Catalog=mystore;Integrated Security=True;MultipleActiveResultSets=true";
public string errorMessage = "";
public string SuccessMessage = "";
[BindProperty]
public List<InvoiceItem> InvoiceItems { get; set; } = new List<InvoiceItem>();
确保sql连接正确,表名
Titem
和列名(ItemName
,ItemQuantity
,Price
)正确。