gpt4 book ai didi

c# - 如何防止 Entity Framework 强制验证子对象属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:28 24 4
gpt4 key购买 nike

我有一个使用 .Net 4.0 Framework 和 Entity Framework 4.4 的 ASP.NET MVC 3 项目。我正在为 Entity Framework 使用带有迁移方法的代码优先。

我有一个对象 A,它具有对象 B 的属性。对象 A 实际上只需要知道对象 B 的 ID,但是 MVC 正在对对象 B 强制执行所有注释验证,因为我在对象 A 中将其标记为必需 (它是)。 ModelState.IsValid 始终返回 false,因为提交表单时对象 B 上的某些验证失败。

例子:

    public class FormField
{
public int Id { get; set; }

[MaxLength(50)]
[Required]
[DisplayName("Field Name")]
public string Name { get; set; }

[Required]
public Form Form { get; set; }
}

public class Form
{
public Form()
{
Fields = new List<FormField>();
}

public int Id { get; set; }
[Required]
public string Name { get; set; }
public List<FormField> Fields { get; set; }
}

这在编辑现有 FormField 时不是问题,因为我可以在页面上放置一个具有 Form.Name 属性的隐藏字段(这仍然让我觉得应该是不必要的)。创建新的 FormField 时会出现问题。我显示一个表单下拉列表(这是从我的 View 模型中填充的),并使该字段指向 FormField.Form.Id 属性。 ASP .NET MVC 仍然需要 formField.Form.Name(因为这在 Form 对象上被标记为必需)。

如果我从 FormField 对象的 Form 字段中删除“[Required]”注释,验证将不会触发,但这会使 Form.Id 的外键在数据库中可以为空,这是不应该的是。

有什么想法吗?我可能在这里做错了什么,但我不完全确定是什么。

最佳答案

我删除了 FormField.Form 上的 [Required] 注释。那并没有解决问题。我尝试将“[Bind(Exclude = "vm.FormField.Form")]”添加到要发布的参数中。这会停止绑定(bind),但确保我仍然在 ModelState 中留下验证错误。

最终,我不得不这样做:

        ModelState.Remove("FormField.Form.Id");
ModelState.Remove("FormField.Form.Name");

这阻止了我遇到的 ModelState 错误。因为我真的只需要 Form.Id,所以我在我的 ViewModel“SelectedForm”中有一个属性并将该属性用于该值。

所以......这行得通,但是......这似乎是一个非常乏味的解决方案,因为如果我在 FormField.Form 对象上有更多必填字段,我将不得不列出每个字段并将属性名称硬编码在字符串形式。

谁能想出一种方法来改进这种方法?

关于c# - 如何防止 Entity Framework 强制验证子对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897038/

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