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

ASP.NET Core MVC如何提交表单数据到PostgreSQL并解决空值与405错误

错误原因

  • 405错误:你仅为Table方法添加了[HttpPost]特性,仅支持POST请求,但浏览器首次打开页面时发送的是GET请求,没有对应的GET处理逻辑,因此返回方法不允许的405状态码。
  • 不加[HttpPost]时的空值错误:没有指定请求方法的Action会同时接收GET和POST请求,首次GET请求打开页面时表单还未提交,HttpContext.Request.Form内所有字段都是空值,调用.ToString()方法会触发空引用异常。

解决办法

1. 拆分控制器Action为GET/POST两个版本

分别处理页面加载和表单提交逻辑,同时使用ASP.NET Core自带的模型绑定能力,不需要手动读取Request.Form字段。
改后控制器代码如下:

public class TableController : Controller
{
    private readonly IRegisteredRecordRepository _registeredRecordRepository;
    public TableController(IRegisteredRecordRepository registeredRecordRepository)
    {
        _registeredRecordRepository = registeredRecordRepository;
    }

    // 处理页面首次加载的GET请求
    [HttpGet]
    public IActionResult Table()
    {
        // 加载现有记录传入视图
        var allRecords = _registeredRecordRepository.GetExcelList();
        return View(allRecords);
    }

    // 处理表单提交的POST请求
    [HttpPost]
    public IActionResult Table(RegisteredRecord reg)
    {
        if (ModelState.IsValid)
        {
            _registeredRecordRepository.AddExcelList(reg);
        }
        // 提交后重新加载所有记录返回视图
        var allRecords = _registeredRecordRepository.GetExcelList();
        return View(allRecords);
    }
}

2. 修正视图表单字段名

ASP.NET Core模型绑定要求表单input的name属性和模型类的属性名完全一致,修改表单部分字段如下:

<form asp-controller="Table" asp-action="Table" method="post">
    <table>
        <tr>
            <td>Name:</td>
            <td><input name="name" type="text" /></td>
        </tr>
        <tr>
            <td>WebPort:</td>
            <td><input name="webPort" type="text" /></td>
        </tr>
        <tr>
            <td>JmxPort:</td>
            <td><input name="jmxPort" type="text" /></td>
        </tr>
        <tr>
            <td>Os:</td>
            <td><input name="Os" type="text" /></td>
        </tr>
        <tr>
            <td>CpuType:</td>
            <td><input name="cpuType" type="text" /></td>
        </tr>
        <tr>
            <td>CpuSpeed:</td>
            <td><input name="cpuSpeed" type="text" /></td>
        </tr>
        <tr>
            <td>NrOfCpus:</td>
            <td><input name="nrOfCpus" type="text" /></td>
        </tr>
        <tr>
            <td>NrOfCoresPerCpu:</td>
            <td><input name="nrOfCoresPerCpu" type="text" /></td>
        </tr>
        <tr>
            <td>TotalNrOfCores:</td>
            <td><input name="totalNrOfCores" type="text" /></td>
        <tr>
            <td>RamSize:</td>
            <td><input name="ramSize" type="text" /></td>
        </tr>
        <tr>
            <td>HddSize:</td>
            <td><input name="hddSize" type="text" /></td>
        </tr>
        <tr>
            <td>Ip:</td>
            <td><input name="ip" type="text" value="ip" /></td>
        </tr>
        <tr>
            <td><input id="Submit1" type="submit" value="submit" /></td>
        </tr>
    </table>
</form>

3. 可选优化

如果使用的是C# 8及以上版本,建议将RegisteredRecord类中的字符串属性标记为可空,避免可空引用类型警告:

public class RegisteredRecord
{
    public int id { get; set; }
    public string? name { get; set; }
    public string? webPort { get; set; }
    public string? jmxPort { get; set; }
    public string? Os { get; set; }
    public string? cpuType { get; set; }
    public string? cpuSpeed { get; set; }
    public string? nrOfCpus { get; set; }
    public string? nrOfCoresPerCpu { get; set; }
    public string? totalNrOfCores { get; set; }
    public string? ramSize { get; set; }
    public string? hddSize { get; set; }
    public string? ip { get; set; }
}

内容的提问来源于stack exchange,提问作者Panait Rares Horia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:15:04