ASP.NET Core MVC POST 方法一个具有外键 ID 的模型

Posted

技术标签:

【中文标题】ASP.NET Core MVC POST 方法一个具有外键 ID 的模型【英文标题】:ASP.NET Core MVC POST method a model with foreign key Id 【发布时间】:2021-02-20 05:02:02 【问题描述】:

我正在尝试执行POST,其中模型具有外键字段,但我想将此值设置为创建者的 ID。我有一个名为“Store”的模型,带有 ApplicationUserId FK 。我尝试将包含ApplicationUserId 的新对象“Store”传递给GET 视图,但是当我提交时,ApplicationUserId 字段为空。我也尝试在控制器上手动设置字段,但此时模型状态已经无效

我的行动:

    public async Task<IActionResult> Create(Store store)
        
            store.ApplicationUser = currentUser
            if (ModelState.IsValid)
             
                _context.Add(store);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            
            return View(store);
        

我的模特:

    public class Store
    
        public int Id  get; set; 
        public string Name  get; set; 

        [Required]
        [ForeignKey("ApplicationUserId")]
        public virtual ApplicationUser ApplicationUser  get; set; 
    

【问题讨论】:

您的操作 Create(Store store) 是为了什么?您是要在屏幕上显示视图还是在数据库中保存存储。在您被某人否决之前,请向我们展示更多代码。 如果值到达 null,那几乎总是一个序列化问题。你的模型商店怎么样,你可以用它来编辑你的帖子吗?以及如何获得“当前用户”? @Sergey,这是为了保存在数据库中,我编辑了帖子。 @RodRamírez,我使用“UserManager”类获取当前用户。只有 ApplicationUserId 为空。我用我的模型编辑了帖子。 抱歉,我在您的 Store 类中没有看到 UserId 属性 【参考方案1】:

您可以分配 UserId(或任何其他属性),它会起作用并将保存到 DB,但不会影响您的 ModelState。 ModelState 将与从客户端发布的相同。有两种方法可以解决它:

    在您使用模型返回视图并将视图作为隐藏字段保留在您的视图中之前,在控制器的 get 操作中分配模型中的 UserId。 检查 ModelState 的哪些属性无效,如果只有 UserId,分配并保存。我可以向您展示可以定义 Modeld 中无效内容的代码

【讨论】:

谢谢,谢尔盖!我虽然在分配用户 ID 后我的模型将变为有效。另一个问题是我没有将该属性添加为隐藏字段。现在我添加了该字段,如果用户没有在前端更改它,我会检查我的操作。

以上是关于ASP.NET Core MVC POST 方法一个具有外键 ID 的模型的主要内容,如果未能解决你的问题,请参考以下文章

对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败

EF Core 中的 ASP.NET Core 5 MVC 和 Identity - 基于资源的授权

在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

使用 ASP.NET Core MVC 创建 Web API