如何在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
相关产品推荐
相关产品推荐

