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

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,提问作者Парсонале

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:42:36