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

如何在ASP.NET页面中调用C# Database类实现表单数据入库?

解决方案

1. 修正Database类的错误

你的Database类存在语法和逻辑错误,先修复这些问题才能正常工作:

  • 拼写错误:Integred Security → Integrated Security
  • SQL语句错误:INSERT INTO Class(ClassId, Name), VALUES(...) 中多了逗号,应改为 INSERT INTO Class(ClassId, Name) VALUES(...)
  • 参数绑定错误:@Name 错误绑定了Id,需改为绑定ClassName
  • 重复调用connection.Open(),且未用using语句释放资源(会导致数据库连接泄漏)

修正后的Database.cs:

using System;
using System.Data.SqlClient;

namespace StudentWebApp.Pages.Shared
{
    public class Database
    {      
        public void ClassRecord(int classId, string className)
        {
            // 使用using自动释放连接资源
            using (var connection = new SqlConnection(@"server=(localdb)\local; Initial Catalog=Class; Integrated Security=SSPI"))
            {
                string insertQuery = "INSERT INTO Class(ClassId, Name) VALUES(@ClassId, @Name)";
                using (var command = new SqlCommand(insertQuery, connection))
                {
                    command.Parameters.AddWithValue("@ClassId", classId);
                    command.Parameters.AddWithValue("@Name", className);
                    
                    connection.Open();
                    command.ExecuteNonQuery();
                }
            }
        }
    }
}

2. 在Razor页面后台代码(PageModel)中处理表单提交

Razor页面的业务逻辑应放在对应的.cshtml.cs文件(即AddClassPage.cshtml.cs)中,而非直接在视图文件里调用Database类。

创建/修改AddClassPage.cshtml.cs:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using StudentWebApp.Pages.Shared; // 引用Database类的命名空间

namespace StudentWebApp.Pages
{
    public class AddClassPageModel : PageModel
    {
        // 绑定表单提交的字段
        [BindProperty]
        public int ClassId { get; set; }

        [BindProperty]
        public string ClassName { get; set; } = string.Empty;

        public void OnGet()
        {
            // GET请求初始化页面的逻辑
        }

        // 处理表单POST提交
        public IActionResult OnPost()
        {
            if (!ModelState.IsValid)
            {
                return Page(); // 验证失败返回原页面
            }

            // 实例化Database类并调用保存方法
            var db = new Database();
            db.ClassRecord(ClassId, ClassName);

            // 提交成功后跳转(示例:返回当前页)
            return RedirectToPage();
        }
    }
}

3. 修改AddClass.cshtml视图

更新表单提交方式为POST,并绑定PageModel的属性:

@page
@model StudentWebApp.Pages.AddClassPageModel <!-- 关联正确的PageModel -->
@{
    ViewData["Title"] = "Add Class";
}

<div class="p-3 mb-2 bg-dark text-white">
    <h2 class="display-4">Add Class</h2>
</div>
<!-- 设置表单POST提交,ASP.NET自动处理防伪造令牌 -->
<form method="post">
  <div class="form-group">
    <label for="classId">Class ID (number only):</label>
    <!-- asp-for绑定PageModel的ClassId属性 -->
    <input type="number" class="form-control" min="0" id="classId" asp-for="ClassId" placeholder="Class ID">
    <!-- 显示字段验证错误 -->
    <span asp-validation-for="ClassId" class="text-danger"></span>
  </div>
  <div class="form-group">
    <label for="className">Class Name:</label>
    <input type="text" class="form-control" id="className" asp-for="ClassName" placeholder="Class Name">
    <span asp-validation-for="ClassName" class="text-danger"></span>
  </div>
  <button type="submit" class="btn btn-grey">Add</button>
</form>

关键要点

  • 命名空间引用:通过using StudentWebApp.Pages.Shared;让PageModel能访问Database类
  • 表单提交逻辑:Razor页面默认用OnPost方法处理POST请求,表单必须设置method="post"
  • 模型绑定:用[BindProperty]标记属性,配合asp-for标签助手实现表单数据自动绑定
  • 资源管理:using语句确保数据库连接和命令对象自动释放,避免资源泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:03:23