使用自定义类重载 EF 验证

Posted

技术标签:

【中文标题】使用自定义类重载 EF 验证【英文标题】:Overload EF Validation with Custom class 【发布时间】:2012-09-24 07:54:41 【问题描述】:

我正在使用实体框架,并且有一个视图,它是 tblAuthorMaster 类型的强类型视图模型。在 Post ModelState 上返回以下错误:

值“0”对状态无效。

这里的状态是 DB/EF 中的布尔数据类型,查看它的下拉列表(TEXT="active/inactive", VALUE="1/0"),所以每当我发布我的表单时,我都会收到上述错误消息.

我已经尝试了一些解决方案来解决这个问题,但它似乎无法正常工作。

以下是我的代码库:

这里 tblAuthorMaster 是 EF 类,AuthorModel 是我的自定义类,我将其用于一些自定义验证和其他内容。

[元数据类型(typeof(AuthorModel))] 公共部分类 tblAuthorMaster 公共类 AuthorModel [必需(错误消息 =“*”)] 公共字符串作者姓名 获取;放; [必需(错误消息 =“*”)] 公共布尔状态获取;放;

提前致谢。

【问题讨论】:

【参考方案1】:

要使其正常工作,下拉列表中的 VALUE 必须是 true/false 而不是 1/0。由于您尚未展示如何生成 doropdown,因此很难提供帮助,但它可能看起来像这样:

<%= html.DropDownListFor(
    x => x.Status,
    new[] 
    
        new SelectListItem  Value = "true", Text = "active" ,
        new SelectListItem  Value = "false", Text = "inactive" ,
    
) %>

另外,使用具有 2 个可能值的下拉菜单有什么意义? HTML 为您提供了用于此目的的复选框:

<%= Html.CheckBoxFor(x => x.Status) %>

最后一句话:您在问题中所称的 视图模型 根本不是视图模型。这是一个自动生成的 EF 域模型。视图模型是您专门为给定视图的要求设计的类,它们不是由某些向导自动生成的。

【讨论】:

将值设置为 true/false 可以正常工作,但为什么不使用 1/0。 因为在 .NET 中,布尔类型可以具有值 truefalse,而不是 10,这与其他一些语言(例如 javascript)相反。当默认模型绑定器尝试将请求中的值解析为布尔值时,它会失败并将错误消息添加到ModelState 谢谢 Darin 实际上我正在寻找其他选项,其中包括我的 AuthorModel 类中的一些更改。你能推荐类似的东西吗??? 是的,如果您想绑定到10,请使用Integer 而不是Boolean。这当然是一种非常错误的做法。

以上是关于使用自定义类重载 EF 验证的主要内容,如果未能解决你的问题,请参考以下文章

使用标记调度存在自定义 CUDA 分配器时重载类新运算符

如何为自定义类重载`float()`?

自定义类没有可行的重载运算符 []

C++ 运算符重载四(自定义数组类)

自定义异常类

自定义交叉验证和极端不平衡类的验证