You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交Razor Page表单后本地SQL Server Express数据库无数据变更

问题排查:本地SQL Server Express数据插入无响应且无报错

提交表单后数据未写入数据库,且无任何错误提示,核心问题集中在SQL语句、参数传递、异常处理三个环节,以下是具体问题分析和修正方案:

核心错误点

  1. INSERT语句无效:原语句VALUES (Email, PasswordHash, DataCreazione, Ruolo)是将列值插入对应列,没有传入实际表单参数,等同于无意义的重复赋值,且DataCreazione未指定值。
  2. 未使用参数化查询:直接使用列名而非参数,既无法传递表单数据,还存在SQL注入风险。
  3. 异常处理失效:Console.WriteLine在Razor Pages环境中不会输出到前端或日志,导致错误被隐藏。
  4. ModelState验证无效:通过方法参数接收表单数据,无法触发ASP.NET Core的自动验证逻辑,ModelState.IsValid无法正确校验输入合法性。
  5. 冗余连接关闭:using块会自动释放连接资源,无需手动调用conn.Close()。

修正后的代码

1. DbController类(数据库操作层)

using Microsoft.Data.SqlClient;
using System;

public class DbController
{
    public void AggiungiUtente(string email, string pass, string ruolo)
    {
        using (SqlConnection conn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=DomainDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"))
        {
            try
            {
                conn.Open();
                // 使用参数化查询,自动填充当前时间到DataCreazione
                string query = "INSERT INTO Utente (Email, PasswordHash, DataCreazione, Ruolo) VALUES (@Email, @PasswordHash, GETDATE(), @Ruolo)";
                SqlCommand cmd = new SqlCommand(query, conn);
                
                // 绑定表单参数
                cmd.Parameters.AddWithValue("@Email", email);
                cmd.Parameters.AddWithValue("@PasswordHash", pass); // 注意:实际项目必须加密密码,禁止存储明文
                cmd.Parameters.AddWithValue("@Ruolo", ruolo);
                
                // 获取影响行数,用于调试
                int affectedRows = cmd.ExecuteNonQuery();
                Console.WriteLine($"插入完成,影响行数:{affectedRows}");
            }
            catch (Exception ex)
            {
                // 抛出异常让上层处理,或写入日志系统
                throw new Exception("数据插入失败", ex);
            }
        }
    }
}

2. .cshtml.cs页面(表单处理层)

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DomainManager.Pages
{
    public class AggiungiUtentiModel : PageModel
    {
        private readonly DbController _dbController;

        // 使用BindProperty绑定表单字段,支持自动验证
        [BindProperty]
        public string Email { get; set; }
        [BindProperty]
        public string Password { get; set; }
        [BindProperty]
        public string Ruolo { get; set; }

        public AggiungiUtentiModel()
        {
            _dbController = new DbController();
        }

        public IActionResult OnPost()
        {
            if (ModelState.IsValid)
            {
                try
                {
                    _dbController.AggiungiUtente(Email, Password, Ruolo);
                    // 插入成功后通过TempData传递提示信息
                    TempData["SuccessMessage"] = "用户添加成功!";
                    return RedirectToPage("/AggiungiUtenti");
                }
                catch (Exception ex)
                {
                    // 将错误信息添加到ModelState,在页面显示
                    ModelState.AddModelError(string.Empty, $"添加失败:{ex.InnerException?.Message ?? ex.Message}");
                }
            }
            // 验证失败或插入失败时返回页面
            return Page();
        }
    }
}

3. Razor页面(前端表单层)

@page "/aggiungiutenti"
@model DomainManager.Pages.AggiungiUtentiModel
@{Layout = null;}

<!doctype html>
<html class="fixed">
<head>
    <!-- 原有head内容保留 -->
</head>
<body>
    <section class="body-sign">
        <div class="card-sign center-sign">
            <div class="card-body mt-3">
                <!-- 显示成功提示 -->
                @if (TempData["SuccessMessage"] != null)
                {
                    <div class="alert alert-success">@TempData["SuccessMessage"]</div>
                }
                <!-- 显示错误提示 -->
                @if (!ModelState.IsValid)
                {
                    <div class="alert alert-danger">
                        @foreach (var error in ModelState.Values.SelectMany(v => v.Errors))
                        {
                            <p>@error.ErrorMessage</p>
                        }
                    </div>
                }
                <form method="post">
                    <div class="form-group mb3">
                        <label>Email:</label>
                        <div>
                            <input type="email" asp-for="Email" class="form-control form-control-lg">
                            <span asp-validation-for="Email" class="text-danger"></span>
                        </div>
                    </div>
                    <div class="form-group mb3">
                        <label>Password:</label>
                        <div>
                            <input type="password" asp-for="Password" class="form-control form-control-lg">
                            <span asp-validation-for="Password" class="text-danger"></span>
                        </div>
                    </div>
                    <div class="form-group row pb-4">
                        <label class="form-group mb3">Ruolo:</label>
                        <div>
                            <select asp-for="Ruolo" class="form-control form-control-lg mb-3">
                                <option style="text-align: center" value="Amministratore">Amministratore</option>
                                <option style="text-align: center" value="Utente">Utente</option>
                            </select>
                            <span asp-validation-for="Ruolo" class="text-danger"></span>
                        </div>
                    </div>
                    <button type="submit" class="btn btn-primary" style="display: block; margin: 0 auto; width: 100%">Invia </button>
                </form>
            </div>
        </div>
    </section>
</body>
</html>

额外建议

  • 密码加密:使用BCrypt.Net等库对密码进行哈希处理后再存入数据库,绝对禁止存储明文密码。
  • 日志记录:使用ASP.NET Core内置的ILogger记录异常,替代Console.WriteLine,便于生产环境排查问题。
  • 连接字符串配置:将连接字符串移至appsettings.json中,避免硬编码,方便多环境切换。
  • 数据库实例检查:通过SQL Server Management Studio连接(localdb)\MSSQLLocalDB,确认DomainDb数据库及Utente表结构与代码匹配。

内容的提问来源于stack exchange,提问作者Fraxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:05:56