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

