【问题标题】:Add record to table with FK使用 FK 向表中添加记录
【发布时间】:2020-10-04 09:31:02
【问题描述】:

我有一个表 UserStoreName,

列是:

int ID

字符串 UserNameId(作为表 AspNetUsers(列 ID)的 FK)

sring StoreName

我有一个 AddStore 页面,这是一个非常简单的页面,用户只需在 StoreName 字段中输入商店名称即可。 我已经知道 UserNameId,我是从用户那里获取的。 因此,当用户填充 storeName 字段并单击提交时,我只需向表 UserStoreName 添加一条记录。 听起来很容易。 当我单击提交时,控制器中的 AddStore 函数给了我 ModelState.IsValid = false。 原因是 userNameId 是必填字段。 我想在 AddStore 中填充该字段 函数,但是当我们到达那里时,modelState 已经无效,因为 userStoreNameId 中的必填字段在此处输入代码 这是 AddStore 以防万一:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddStore(UserStoreName userStoreName)
{
    userStoreName.UserNameId =
    (_unitOfWork.ApplicationUser.GetAll().Where(q => q.UserName == User.Identity.Name).Select(q => q.Id)).FirstOrDefault();
    userStoreName.UserName = User.Identity.Name;
    userStoreName.IsAdminStore = false;
    if (ModelState.IsValid)
    {
            _unitOfWork.UserStoreName.Add(userStoreName);
        
        _unitOfWork.Save();
        return RedirectToAction(nameof(Index));
    }
    return View(userStoreName);
}

知道我做错了什么吗? asp.net core mvc 的新手,这是我的第一个项目。 谢谢 :) 谢谢

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-mvc


    【解决方案1】:

    如果需要 UserNameId 字段,则必须提供它以通过模型验证。

    有两种方法可以解决这个问题。首先,您可以创建一个视图模型,其中仅包含您计划实际提交的字段,并使用它来代替 userStoreName 变量。然后在控制器操作中,您只需实例化一个新的 UserStoreName 对象,并填写字段。

    或者,您可以将 UserNameId 变量传递给视图,并使用隐藏字段填充模型客户端,以便在返回到控制器时通过验证。但是,隐藏字段可能会在客户端对其值进行编辑,因此可能值得再次检查服务器端的值,尤其是在存在任何安全隐患的情况下。

    【讨论】:

    • 谢谢!使用 ViewBag 传递变量并且它起作用了。
    【解决方案2】:

    外键可以为空,因此只需确保 UserNameId 字段在您的模型中未使用“[必需]”数据注释进行标记。

    您还需要确保UserStoreName 表上的列可以为空以匹配模型,否则如果您的模型与其基础表不同,则会导致问题。

    也只是一个小建议,我不会在字符串上使用外键,我会将您的模型外键更改为 int,并确保与其相关的表中的列也是 int。这样做更安全,尤其是在处理 IDENTITY 列时。

    如果引用有任何问题,当代码尝试保存更改时会抛出异常,通常是因为在相关表中找不到它在 FK 引用中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2012-08-15
      • 2015-05-04
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多