使用自定义类重载 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 中,布尔类型可以具有值true
或 false
,而不是 1
和 0
,这与其他一些语言(例如 javascript)相反。当默认模型绑定器尝试将请求中的值解析为布尔值时,它会失败并将错误消息添加到ModelState
。
谢谢 Darin 实际上我正在寻找其他选项,其中包括我的 AuthorModel 类中的一些更改。你能推荐类似的东西吗???
是的,如果您想绑定到1
或0
,请使用Integer
而不是Boolean
。这当然是一种非常错误的做法。以上是关于使用自定义类重载 EF 验证的主要内容,如果未能解决你的问题,请参考以下文章