ASP.NET Core:视图向控制器传Id失败,接收的Guid全为0
解决ASP.NET Core中Guid类型Id无法通过隐藏字段传递的问题
问题分析
你遇到的Guid全为0的问题,核心原因是隐藏字段写法错误,同时存在视图与控制器动作的匹配混淆:
- 视图中同时使用
asp-for="Id"和手动指定value="@obj.Id",asp-for标签助手会自动生成name、id和value属性,手动设置的value会覆盖正确的模型值,甚至可能因obj在视图上下文中未正确传递导致值为空。 - 视图标题显示"Create Category",但控制器动作是
Edit,存在视图复用或路由匹配的混淆。
修正方案
1. 修复隐藏字段写法
删除手动设置的value属性,让asp-for自动绑定模型的Id值:
@model Category <form method="post"> <!-- 正确的隐藏字段:asp-for自动绑定模型的Id --> <input type="hidden" asp-for="Id"/> <div class="border p-3 mt-4"> <div class="row pb-2"> <!-- 编辑页面标题修正为Edit Category --> <h2 class="text-primary">Edit Category</h2> </div> <div class="mb-3"> <label asp-for="Name"></label> <input asp-for="Name" class="form-control"/> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="mb-3"> <label asp-for="DisplayOrder"></label> <input asp-for="DisplayOrder" class="form-control"/> <span asp-validation-for="DisplayOrder" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary" style="width:150px">Save</button> <a asp-controller="Category" asp-action="Index" class="btn btn-secondary" style="width:150px"> Back to List </a> </div> </form> @section Scripts { @{ <partial name="_ValidationScriptsPartial" /> } }
2. 确保控制器Get动作正确传递模型
补充Get方式的Edit动作,从数据库获取带有效Id的Category对象并传递给视图:
public IActionResult Edit(Guid id) { var category = _db.Categories.FirstOrDefault(c => c.Id == id); if (category == null) { return NotFound(); } return View(category); }
3. 显式指定表单路由(可选)
如果路由匹配存在歧义,可在form标签中显式指定目标动作和控制器:
<form method="post" asp-action="Edit" asp-controller="Category">
额外排查点
- 确认
Category类的Id属性为Guid类型,且数据库中存储的是有效Guid值而非Guid.Empty:
public class Category { public Guid Id { get; set; } public string Name { get; set; } public int DisplayOrder { get; set; } }
- 检查模型绑定错误,可在控制器中打印
ModelState的错误信息:
if (!ModelState.IsValid) { var errors = ModelState.SelectMany(x => x.Value.Errors.Select(e => e.ErrorMessage)); // 打印或记录错误信息用于排查 return View(obj); }
内容的提问来源于stack exchange,提问作者Парсонале
相关产品推荐
相关产品推荐

