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

ASP.NET MVC表单提交跳转无效页面,无法保存数据至数据库

ASP.NET MVC 表单提交失败问题排查与修复

核心问题总结

表单提交后跳转无效页面且数据未保存,根源是控制器/Action名称不匹配、模型字段类型错误,以及视图脚本语法错误。

具体错误点与修复方案

1. 控制器名称不匹配

  • 视图中表单指定的控制器是Admin:
    <form asp-action="CreateProduct" asp-controller="Admin" method="post">
    
  • 但文件结构中的控制器是ProductController.cs,控制器类名与视图指定的Admin不匹配,导致路由无法找到对应控制器。

修复:

  • 方案一:将ProductController.cs重命名为AdminController.cs,类名同步改为AdminController;
  • 方案二:修改视图中的asp-controller属性值为Product:
    <form asp-action="CreateProducts" asp-controller="Product" method="post">
    

2. Action名称拼写不一致

  • 视图中asp-action值为CreateProduct,但控制器中的POST方法名称是CreateProducts(末尾多了s):
    public async Task<IActionResult> CreateProducts(Product product)
    
  • 名称不匹配导致路由无法定位到正确的POST处理方法,直接跳转至无效页面。

修复:
统一Action名称,要么修改视图的asp-action为CreateProducts,要么修改控制器的Action名称为CreateProduct。

3. 模型Price字段类型错误

  • Product模型中Price是string类型,但添加了仅对数值类型生效的Range验证:
    [Required]
    [Range(0, double.MaxValue, ErrorMessage = "Price must be a positive number.")]
    public string Price { get; set; }
    
  • 该验证无法作用于字符串类型,导致ModelState.IsValid始终为false,无法进入数据库保存逻辑。

修复:
将Price字段改为适合货币场景的数值类型(如decimal):

[Required]
[Range(0, double.MaxValue, ErrorMessage = "Price must be a positive number.")]
public decimal Price { get; set; }

4. 视图脚本嵌套错误

视图中出现<script>标签嵌套的语法错误:

<script>
    <script src="~/js/create-product.js"></script>
</script>

这会导致JS文件加载失败,虽不直接影响表单提交,但属于无效语法。

修复:
移除外层多余的<script>标签,保留正确的引用格式:

<script src="~/js/create-product.js"></script>

5. 路由配置优化(可选)

当前admin路由的默认Action为ManageProducts,若使用属性路由可减少歧义,示例如下:

[Route("Admin/ManageProducts")]
public async Task<IActionResult> ManageProducts()
{
    var products = await _context.Products.ToListAsync();
    return View(products);
}

[Route("Admin/CreateProducts")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateProducts(Product product)
{
    // 原有逻辑
}

验证步骤

  1. 修正上述错误后启动应用;
  2. 填写表单提交,检查是否正常跳转至ManageProducts页面;
  3. 查看数据库确认新产品数据已保存;
  4. 若仍有问题,在控制器的else分支添加日志输出,查看ModelState具体错误:
    else
    {
        foreach (var error in ModelState.Values.SelectMany(v => v.Errors))
        {
            Console.WriteLine(error.ErrorMessage);
        }
    }
    

内容的提问来源于stack exchange,提问作者Faisal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:05:24