ASP.NET Core MVC视图传控制器值异常:删除按钮无法传递ID
ASP.NET Core 删除操作ID传递为Null的排查与解决
以下是针对该问题的具体排查和解决步骤:
1. 核对控制器参数与视图绑定的匹配关系
- 若控制器Delete方法参数为
int id,需确保视图中隐藏输入的name属性值为id。如果使用ViewModel层级(如FormVM.Form.Id),可直接指定name而非依赖标签助手:<input type="hidden" name="id" value="@Model.Form.Id" /> - 若坚持使用ViewModel接收参数,控制器方法需调整为接收对应ViewModel,并确认绑定属性正确:
public IActionResult Delete(FormVM model) { var targetId = model.Form.Id; // 后续删除逻辑 } - 可添加
[FromForm]特性强制从表单取值,避免绑定源混乱:public IActionResult Delete([FromForm] int id)
2. 确认模型属性的可访问性
检查FormVM和Form模型的属性必须为public且包含读写器,否则绑定系统无法读取属性值:
public class FormVM { public Form Form { get; set; } // 需public,带get/set } public class Form { public int Id { get; set; } // 需public,带get/set }
3. 检查视图表单结构
- 确保隐藏输入和提交按钮都包裹在
<form>标签内部,否则表单提交时不会携带该输入值:<form asp-action="Delete" method="post"> <input asp-for="Form.Id" hidden /> <button type="submit">Delete</button> </form> - 查看页面渲染后的HTML源码,确认隐藏输入的
name和value属性是否正确生成(value应显示实际ID值,name需与控制器参数匹配)。
4. 排查模型绑定错误
在控制器Delete方法开头添加绑定状态检查,排查是否存在类型不匹配或绑定失败:
public IActionResult Delete(int id) { if (!ModelState.IsValid) { var errors = ModelState.Values.SelectMany(v => v.Errors); // 输出错误信息排查问题 } // 后续逻辑 }
5. 对比可正常运行的模型代码
逐行对比当前代码与可正常运行的模型:
- 核对ViewModel的属性命名、嵌套层级
- 检查视图中表单的
asp-action、method配置 - 确认控制器参数的类型、名称及绑定特性
内容的提问来源于stack exchange,提问作者Michael Rutherford
相关产品推荐
相关产品推荐

