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

多表关联时ASP.NET的asp-route-id无法传递正确ID

问题排查:WorkView ID在视图中显示错误

模型定义

Users模型

public class Users
 {
     [Key]
     [DisplayName("__ Users UserID __")]
     public int UserID { get; set; }
     
     [StringLength(7)]
     [DisplayName("User LAN ID")]

public ICollection<WorkView>? WorkView { get; set; }
 }

WorkView模型

public class WorkView
        {
            [Key]
            [DisplayName("** WorkView ID **")]
            public int ID { get; set; }
    
            [DisplayName("** WorkView mainUserID **")]
            public int? mainUserID{ get; set; }
    

    public Users? Users { get; set; }
            public string? FirstName { get; internal set; }
            public string? LastName { get; set; }
            public string? UserName { get; set; }
            public string? JobTitle { get; set; }
            public string? OfficeLocation { get; set; }
            public string? ManagerFirstName { get; set; }
            public string? ManagerFamilyName { get; set; }
            public string? Email { get; set; }
    }

控制器代码

[HttpGet("WorkView/{id}")]
//Opening the WorkView Creation
public async Task<IActionResult> WorkViewCreate(int? id)
{
    if (id == null || _context.Users == null)
    {
        return View();
    }

    var user = await _context.Users.FindAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    var workView = (from w in _context.WorkView
                    join u in _context.Users on w.mainUserID equals u.UserID
                    where (w.mainUserID == id)
                    select new WorkView
                    {
                        ID = w.ID,
                        mainUserID = u.UserID,
}).FirstOrDefault();

    var workViewTest = _context.WorkView;

    Console.WriteLine("workView.ID = " + workView.ID);
    Console.WriteLine("workView.mainUserID = " + workView.mainUserID);  
    return View(workView);

}

视图代码

<script src="~/js/workViewScript.js" defer>
</script>

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<form asp-controller="Home" asp-action="WorkViewedit" asp-route-id="@Model?.OfficeLocation">

    <div style="border:ridge;background-color:lightsalmon;">
        <label asp-for="mainUserID"></label>
        <input asp-for="mainUserID" type="text" class="form-control" aria-label="mainUserID" aria-describedby="basic-mainUserID" style="width:auto;" />
    </div>
    <div style="border:ridge;background-color:lightsalmon;">
        <label asp-for="ID"></label>
        <input asp-for="ID" type="text" class="form-control" aria-label="ID" aria-describedby="basic-ID" style="width:auto;" />
    </div>

    <div style="border:ridge;background-color:lightsalmon;">
        <label asp-for="mainUserID"></label>
        <input asp-for="mainUserID" type="text" class="form-control" aria-label="mainUserID" aria-describedby="basic-mainUserID" style="width:auto;" />
    </div>
    <input type="submit" value="submit" />
    
</form>

问题现象

控制器Console输出确认workView.ID为472,workView.mainUserID为23,但视图中显示的ID却是Users的ID(23),而非正确的WorkView ID,导致无法正常保存数据。

排查与解决

核心原因

查询构造WorkView对象时,仅赋值了ID和mainUserID,但未显式将Users导航属性设为null。ASP.NET MVC的asp-for标签助手绑定ID字段时,会优先遍历导航属性Users中的UserID(二者均为int类型),最终显示的是Users.UserID而非WorkView.ID。

解决步骤

  1. 修改查询对象初始化,显式设置导航属性为null:
var workView = (from w in _context.WorkView
                join u in _context.Users on w.mainUserID equals u.UserID
                where (w.mainUserID == id)
                select new WorkView
                {
                    ID = w.ID,
                    mainUserID = u.UserID,
                    Users = null // 新增此行,避免导航属性干扰绑定
                }).FirstOrDefault();
  1. 可选优化:若无需Users的其他数据,可直接查询WorkView,去掉不必要的关联查询:
var workView = await _context.WorkView
    .FirstOrDefaultAsync(w => w.mainUserID == id);

此写法更简洁,同时避免导航属性自动关联的问题。

  1. 验证视图绑定:确认视图中asp-for="ID"绑定的是WorkView模型的ID字段,修改后重新测试,视图将正确显示WorkView的ID(472)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:35:01