【问题标题】:EF 5 Database First using custom validationEF 5 Database First 使用自定义验证
【发布时间】:2012-10-10 19:14:08
【问题描述】:

为了体验 Entity Framework 的新功能,我创建了一个新的 MVC 4 互联网应用程序。
我将其连接到现有数据库并使用 dbContext 生成器生成模型类。

通过运行应用程序,我在编辑表单时遇到了一些验证错误。作为 DateTime 字段的示例,如果将日期插入为“12/10/2012”而不是 2012-10-12(如在 SQ Server 表示法中),系统会抱怨。
我试图在项目中找到验证码,但在生成的代码中的任何地方都找不到。

我的模型类之一如下:

public partial class Artist
{
    public Artist()
    {
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> DateOfBirth { get; set; }

    public virtual Countries Countries { get; set; }
}

如果使用数据库优先方法,我如何自定义验证错误?
如果我用我的验证属性装饰模型,那么一旦再次生成模型类,它们就会被删除。

此外,在强制使用现有数据库的“现实世界”项目中,开发模型类的最佳方法是什么?
通过添加同名的部分类来扩展自动生成的类?

编辑(视图的引入部分):

@using (Html.BeginForm()) {
@Html.ValidationSummary(false)

<fieldset>
    <legend>Movie</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.DateOfBirth)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DateOfBirth)
        @Html.ValidationMessageFor(model => model.DateOfBirth)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

【问题讨论】:

  • 您的视图是什么样的?以 MM/DD/YYYY 格式输入日期应该没有问题,因为在将其发送到 SQL Server 之前,它会在 .net 中转换为 DateTime。因此,在您看来,您一定是在做一些有点不靠谱的事情。除非您尝试以 DD/MM/YYYY 格式输入日期,在这种情况下,这是一个完全不同的全球化问题。但是,您给出的示例不应该给出任何验证错误,因为无论哪种方式它都是有效的(尽管如果使用 DD/MM/YYYY 显然可能不会给出您想要的结果)
  • 您可以使用 Fluent API 添加验证约束:msdn.microsoft.com/en-us/data/gg193959.aspx
  • @millimoose - 这些约束仅适用于数据库,不适用于 MVC 验证。
  • 您使用什么日期格式?您确定 12/10/2012 会产生错误吗?因为无论哪种方式它都应该通过验证。现在,像 2012 年 10 月 15 日这样的事情就不同了。
  • 如果你想要答案,Luca.. 我建议回答人们问你的问题,否则有什么意义?

标签: c# asp.net-mvc visual-studio-2010 entity-framework


【解决方案1】:

嗯,你总是可以使用元数据类

public partial class ArtistMetaData
{
   [Required]
   [StringLength(20)]
   public string Name;//it can be a field instead of a property, must just have the same name and type than in your Model class
}

和一个部分类

[MetadataType(typeof(ArtistMetaData)]
public partial class Artist {
}

或者(我的首选解决方案)您可以使用外部验证库,例如出色的 FluentValidation

默认情况下,您有一个“基本”验证(可以在 global.asax 中删除),检查:不可为空的值...不为空(如默认的必需属性),并且值是正确的类型。

【讨论】:

  • +1 - 我发现元数据类是一个优雅的解决方案。在 Global.asax 中,我找不到任何关于验证的方法。这是我唯一可以看的地方吗?
  • @Luca 你在 Global.asax 中什么都没有,但你可以明确地在 application_start 中的“隐式”提供程序上做事情,例如通过将 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes 属性设置为 false(你赢了'在尝试将 null 放入 int 属性时,没有默认消息“属性 xxx 不应为 null”或类似的信息)
  • 我添加了它并将其值设置为 false,但仍然出现消息。它与日期格式有关,因为通过以“SQL Server”格式 (yyyy-mm-dd) 输入它可以通过验证。
  • @Luca 是的,这不是同一个问题(AddImplicit ... 如果您将 null 设置为不可为 null,则只需给出一条消息)。对于您的问题,您可以查看 CustomModelBinder,它可以将不同格式的 DateTimes 绑定到正确的 DateTime。
  • 今天我再次运行该项目并使用 jQuery 日期选择器作为日期字段,并且应用程序正在接受日期格式而没有抱怨。奇怪的是,自昨天以来我没有更改系统中的任何内容,因此我猜在构建期间未设置某些属性/设置。感谢您的有用建议!
【解决方案2】:

检查您的浏览器和机器文化设置,然后检查 jquery 验证文化。

我有这个问题,因为我有西班牙语配置,但 mvc 带有英文日期和货币格式等。例如 dd/mm/yyyy vs mm/dd/yyyy

您还可以根据需要使用正则表达式属性来验证字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多