ASP.NET Core中HTML输入框值与C#变量绑定及数据库写入问题
搞定你的Razor页面表单绑定和数据库操作问题
嘿,先来说你遇到的Request["username"]报错,再帮你把代码里的坑都填上:
1. 核心报错的根源与快速修复
你看到的那个错误提示,其实不是Request["username"]本身的语法问题,而是你的代码缺少表单提交的基础结构——没有<form>标签,按钮也没设成提交类型,导致点击按钮时根本不会把输入框的数据发去服务器。而且在Razor Pages里,更规范的做法是用模型绑定来获取表单数据,而不是直接用Request。
方式一:推荐用模型绑定(Razor Pages标准写法)
先改你的Razor页面,加上<form>和提交按钮,用asp-for绑定模型属性:
@page @model BlindTest.Pages.RegisterModel @{ ViewData["Title"] = "Register"; Layout = "~/Pages/_Layout.cshtml"; } <h2>Register</h2> <br /> <form method="post"> <input type="text" asp-for="Username" placeholder="Username"/> <input type="password" asp-for="Password" placeholder="Password"/> <!-- 密码用password类型更安全,不会明文显示 --> <input type="email" asp-for="Email" placeholder="Email"/> <br /> <button type="submit">Register</button> </form>
然后在RegisterModel.cs(没有的话新建这个类文件)里定义绑定属性和提交逻辑:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace BlindTest.Pages { public class RegisterModel : PageModel { // [BindProperty]标记这个属性会自动绑定表单提交的数据 [BindProperty] public string Username { get; set; } [BindProperty] public string Password { get; set; } [BindProperty] public string Email { get; set; } // GET请求打开页面时执行的逻辑 public void OnGet() { } // POST请求(表单提交)时执行的逻辑 public IActionResult OnPost() { // 先验证表单数据是否合法 if (!ModelState.IsValid) { return Page(); // 验证失败就返回当前页面 } // 这里直接用this.Username、this.Password、this.Email就能拿到用户输入的值了 // 后面的数据库操作就写在这里 // 注册成功后跳转到首页或者登录页 return RedirectToPage("/Index"); } } }
方式二:临时用Request获取数据(不推荐,但能快速解决报错)
如果你暂时不想改模型,那至少要补上表单结构,并且在正确的时机获取Request数据:
@page @model BlindTest.Pages.RegisterModel @{ ViewData["Title"] = "Register"; Layout = "~/Pages/_Layout.cshtml"; string username = string.Empty; // 只有POST请求时才去拿表单数据 if (Request.Method == "POST") { username = Request.Form["username"]; // 用Request.Form更明确,专门拿表单数据 } } <h2>Register</h2> <br /> <form method="post"> <input type="text" name="username" placeholder="Username"/> <input type="text" name="password" placeholder="Password"/> <input type="text" name="email" placeholder="Email"/> <br /> <button type="submit">Register</button> </form>
2. 数据库连接代码的坑要逐个填
你的数据库代码里有好几个拼写错误和不规范的地方,我帮你修正了:
修正后的数据库操作(放在RegisterModel的OnPost方法里)
using System.Data.SqlClient; using Microsoft.AspNetCore.Mvc.RazorPages; namespace BlindTest.Pages { public class RegisterModel : PageModel { // ... 前面的BindProperty属性和OnGet方法 public IActionResult OnPost() { if (!ModelState.IsValid) { return Page(); } var dbUser = "你的数据库用户名"; var dbPassword = "你的数据库密码"; var serverName = "rinyiau.database.windows.net"; // 修正拼写:SqlConectionStringBuilder → SqlConnectionStringBuilder(少了个n) SqlConnectionStringBuilder connectionString = new SqlConnectionStringBuilder(); connectionString.DataSource = serverName; // 修正大小写:servername → serverName connectionString.InitialCatalog = "rinyiau.database"; // 这里注意你的数据库实际名称是不是这个 connectionString.IntegratedSecurity = false; // 修正大小写:Integratedsecurity → IntegratedSecurity connectionString.UserId = dbUser; connectionString.Password = dbPassword; connectionString.MultipleActiveResultSets = true; // 一定要用using包裹数据库连接和命令,自动释放资源,避免连接泄漏 using (SqlConnection conn = new SqlConnection(connectionString.ConnectionString)) { // 绝对不要直接拼接SQL!用参数化查询防SQL注入,这是安全底线 string insertSql = "INSERT INTO Users (Username, Password, Email) VALUES (@Username, @Password, @Email)"; using (SqlCommand cmd = new SqlCommand(insertSql, conn)) { // 添加参数,把用户输入的值传到SQL里 cmd.Parameters.AddWithValue("@Username", this.Username); cmd.Parameters.AddWithValue("@Password", this.Password); // 注意:实际项目里密码要加密!比如用BCrypt cmd.Parameters.AddWithValue("@Email", this.Email); conn.Open(); cmd.ExecuteNonQuery(); // 插入/更新/删除用ExecuteNonQuery,不是ExecuteReader(那是查数据用的) } } return RedirectToPage("/Index"); } } }
数据库代码的关键修正点:
- 拼写错误:
SqlConectionStringBuilder、Integratedsecurity、servername这些都要改对 - 用
using语句管理数据库资源,防止连接池耗尽 - 必须用参数化查询,不能直接把用户输入拼到SQL里,不然会被SQL注入攻击
- 插入数据用
ExecuteNonQuery(),ExecuteReader()是用来读取查询结果的,不要用错 - 实际项目里,密码绝对不能明文存!要用BCrypt、Argon2这类加密算法加密后再存到数据库
3. 最后提醒几个小细节
- 确认你的数据库里有对应的表(比如
Users),并且字段名和代码里的一致 - 检查Azure SQL数据库的防火墙设置,允许你的应用服务器访问数据库
- 可以加个
try-catch块捕获数据库异常,给用户显示友好的错误提示,而不是直接抛异常
内容的提问来源于stack exchange,提问作者user9756028
相关产品推荐
相关产品推荐

