无法在 Razor 页面中保存

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

我有一个代码可以检索以前保存的发票数据,还有一个代码可以在更改价格或数量后再次保存它。问题是,当我按下保存按钮时,没有任何反应,没有消息出现,并且数据没有保存。

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>

这四天里,我把所有的东西都改了,代码也仅限于保存数据,只是为了找出问题的原因,但无济于事。连接语句很好,代码也很好。那么问题出在哪里呢?

c# html asp.net-core razor-pages
1个回答
0
投票

问题是,当我按下保存按钮时,没有任何反应,没有 出现消息,并且数据未保存。

您需要确保

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查询

确保sql连接正确,表名

Titem
和列名(
ItemName
,
ItemQuantity
,
Price
)正确。

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