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

ASP.NET Core表单值无法正确传递至Action方法求助

问题分析与解决方案

核心问题

你的表单绑定的是EquipmentViewModel的属性,但Action方法接收的是独立参数,同时存在几个关键不匹配点:

  1. Razor视图未声明绑定的ViewModel类型,导致asp-for生成的表单字段映射逻辑异常
  2. 直接使用独立参数接收表单数据,未利用ASP.NET Core的模型绑定特性适配Razor的表单生成规则
  3. 自定义路由的{id?}参数属于URL路由范畴,与POST请求的表单数据无关,反而容易造成混淆

分步解决

1. 修正Razor视图,声明ViewModel类型

在Create.cshtml顶部添加@model指令,明确表单绑定的ViewModel:

@model WebApplication4.Controllers.EquipmentViewModel

<div>
    <h2>Create Equipement</h2>
    <form asp-action="Create" method="post">
        <div class="form-group">
            <label asp-for="SalleId"></label>
            <input asp-for="SalleId" class="form-control" />
            <span asp-validation-for="SalleId" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="EquipmentName"></label>
            <input asp-for="EquipmentName" class="form-control" />
            <span asp-validation-for="EquipmentName" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-primary">Create</button>
    </form>
</div>

2. 修改Action方法,直接接收ViewModel

将Action的参数改为EquipmentViewModel,让ASP.NET Core自动完成表单数据到模型的映射:

[HttpPost]
public IActionResult Create(EquipmentViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model); // 返回视图展示验证错误
    }

    // 验证SalleId是否存在
    var salle = _context.Salles.FirstOrDefault(s => s.CodeSalle == model.SalleId);

    if (salle != null)
    {
        var equipement = new Equipement
        {
            SalleId = salle.CodeSalle,
            EquipmentName = model.EquipmentName
        };

        _context.Equipements.Add(equipement);
        _context.SaveChanges();

        // 采用PRG模式重定向,避免表单重复提交
        return RedirectToAction("Index");
    }
    else
    {
        // 添加自定义错误信息
        ModelState.AddModelError("SalleId", "无效的SalleId");
        return View(model);
    }
}

3. 调整路由(可选,优化规范)

你定义的createEquipement路由更适合带ID的GET请求(如编辑场景),POST请求不需要该路由,建议移除并保留默认控制器路由:

// 移除自定义的createEquipement路由,保留默认路由即可
endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

验证要点

  • 提交表单时打开浏览器开发者工具(F12),查看Network标签下的POST请求,检查Form Data中是否包含SalleId和EquipmentName字段,且值与输入一致
  • 确认ViewModel的命名空间正确,视图能正常引用该类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:33:15