gpt4 book ai didi

c# - MVC + EntityFramework + 字段验证

转载 作者:行者123 更新时间:2023-11-30 17:44:02 24 4
gpt4 key购买 nike

让我开始讲述这个问题:当我提交我的 View 时,我的操作从一个名为 Customer 的类接收一个对象,该类具有整数外键但应该可以为空。

该类是由 EF Designer 生成的,我的数据库结构如下(我想放一张图片,但它告诉我我需要 10 个信誉):

Customer (Table)
CityId -> City (Table)
CityId
StateId -> State (Table)
StateId
CountryId -> Country (Table)
CountryId

继续,我有一个客户必须在一个城市,必须与州相关,必须与国家相关。

另一方面,我的 View 有 3 个下拉菜单:1 选择国家,另一个从所选国家中选择一个州,第三个是从所选州中选择城市。当我选择国家、 View (通过 JSON)时,用状态等填充另一个下拉列表,所以,显然我只保存了 CityId。

问题是,当我尝试提交时,MVC 向我显示以下验证:

The CountryId field is required.
The StateId field is required.
The CityId field is required.

发生这种情况是因为这些字段是 Int32。因此,我做的第一件事是在 EF 设计器中将这些字段更改为可为空(因为我想通过 ModelState.AddModelError 进行个人验证)。

我还将多重性更改为 0..1。

在数据库中,这些字段必须是不可空的。

但现在,我收到以下错误:错误 3 错误 3031:从第 1074 行开始的映射片段出现问题:表 Cidades 中的不可为空的列 Cidades.EstId 映射到可为空的实体属性。

解决此问题的最佳方法是什么?

提前致谢

最佳答案

这个问题很容易解决:设计 View ,使发布的表单只包含您试图存储在数据库中的实体的属性(Customer)。

这意味着:

  • 您必须仅使用 Html Helpers 来创建与 Customer 相关的控件属性而不是其他实体属性。 IE。不要使用 Html 帮助程序为“Customer.City.CityId”创建控件,而是为“Customer.CityId”创建控件。通过这种方式,您可以确保只有 Customer属性发布到您的 Controller 操作。
  • (我在重复自己,但是)您必须避免创建与任何其他相关实体相关的控件:城市、州和国家/地区。此控件应该是纯 HTML 对象。稍后您只需使用 JavaScript 访问它们(例如,加载级联列表)。唯一必须与任何属性相关的控件是包含城市的下拉列表 (<select>),它必须具有 Customer.CityId。名称,而不是 Customer.City.CityId .

如果这样做,当您发布表单时,您只发布了 Customer对象,因此您的 Controller 中的后操作应该只接收 Customer范围。然后 EF 不会触发任何其他实体的任何验证,只是因为它们不存在,您将摆脱这个问题。

关于验证:根据您的配置,验证可以同时发生在客户端和服务器上。如果你采取这种预防措施,你就会避免双方的问题。不要更改您的模型以接受空值!这是一个糟糕的黑客攻击!

注意:由于您没有显示您的代码,我猜测它或多或少看起来像什么。如果我的回答不够清楚,请更新您的问题,并通过@JotaBe 评论让我知道

关于c# - MVC + EntityFramework + 字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30081755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com