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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:02:19